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

标签 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] 中我得到了 66 arr1[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));

关于c++ - 通过套接字发送整数数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50028731/

相关文章:

c - Ip 结构 C 参数

c++ - boost::asio::ip::tcp::socket -> 如何查询套接字状态?

c++ - 在 OpenGL 中定位对象数组

c - 编写规则或约定并工作 - C 中的头文件

c - 从UINT16到UINT8提取和组合位的更快方法

c - 如何证明 Frama-C + EVA 中非确定性值的简单等式?

Java:同步套接字输入

c++ - 如何调试此类内存损坏?

c++ - 在 C++ 中,如何在基函数中访问派生类的成员? (这甚至是正确的做法吗?)

c++ - 模板元编程 Eigen 表达式