在套接字上发送整数数组的问题

时间:2018-04-25 18:06:11

标签: c++ c sockets ubuntu-17.10

我通过套接字从客户端向服务器发送整数数组。像这样;

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]我得到{{1} }}

我不知道这是怎么发生的,6766来自哪里

1 个答案:

答案 0 :(得分:2)

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