通过套接字发送整数数组时出现问题

Problems sending an integer array over a socket

本文关键字:问题 数组 整数 套接字      更新时间:2023-10-16

我正在通过套接字将整数数组从客户端发送到服务器。喜欢这个;

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]中,我得到了66arr1[2]我得到了67

我不知道这是怎么发生的,6667从何而来

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));