我正在通过套接字从客户端向服务器发送一个整数数组。像这样;
int arr[3] = {5, 4, 1};
send(sock , &arr, 3 , 0); //sending the votes count
并像这样在服务器中接收
recv(new_socket, arr1, 3, 0);
我在 arr1[0]
中得到了正确的值,但在 arr1[1]
中我得到了 66
和 arr1[2]
我得到 67
我不知道这是怎么发生的,也不知道 66
和 67
来自哪里
最佳答案
send()
和 recv()
仅对字节进行操作。您正在发送和接收 3 个字节,但您的数组实际上是 sizeof(int) * 3
字节(其中 sizeof(int)
在许多平台上通常为 4)。你需要在两端使用sizeof()
,例如:
send(sock, &arr, sizeof(arr), 0);
recv(new_socket, &arr1, sizeof(arr1), 0);
但是,你也必须注意返回值,因为send()
可以发送比请求更少的字节,而recv()
可以接收比请求更少的字节. TCP 是面向流的,而不是面向消息的。您应该在一个循环中分别调用 send()
和 recv()
,重新调用每一个,直到所有预期的字节都已完整发送/接收,例如:
ssize_t sendAll(int sckt, void *data, size_t length)
{
char *bytes = (char*) data;
while (length > 0)
{
ssize_t sent = send(sckt, bytes, length, 0);
if (sent == -1) return -1;
bytes += sent;
length -= sent;
}
return 0;
}
int arr[3] = {5, 4, 1};
sendAll(sock, &arr, sizeof(arr));
ssize_t recvAll(int sckt, void *data, size_t length)
{
char *bytes = (char*) data;
while (length > 0)
{
ssize_t recvd = recv(sckt, bytes, length, 0);
if (recvd <= 0) return recvd;
bytes += recvd;
length -= recvd;
}
return 1;
}
int arr1[3];
recvAll(new_socket, &arr1, sizeof(arr1));
关于c++ - 通过套接字发送整数数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50028731/