c++ - 通过 Winsocks 发送一个 int 数组

标签 c++ windows networking

我正在尝试通过 Winsocks 发送一个 int 数组。我可能是错的,但我很确定只支持 char*,所以我对如何正确执行此操作有点困惑。 little/big edian 也有问题,那么这样做的好方法是什么?我已经问过 converting int array to char 的问题了但建议改为在网络部分就此启动一个新线程。

最佳答案

您误解了可以使用 WinSock 发送的内容。是send()被定义为采用 char* 缓冲区,但实际上它只采用数据缓冲区。如果今天定义了 send(),buf 将被定义为 void*。但我相信在定义 sent() 时 void* 不是 C 标准的一部分。

总结就是 send() 不考虑你传递给它的指针类型,它只是获取指针指向的原始字节并将它们填充到数据包中。它从不看他们。所以传递数组没有错:

int sendArray(SOCKET sock, int array[], int arrayLen) {
    // You need to send the array length so the receiver knows
    // how long the array is
    int bytesSent = send(sock, (char*)&arrayLen, sizeof(arrayLen));

    if (bytesSent != SOCKET_ERROR) {
       // If that worked, send the 
       bytesSent = send(sock, (char*)array, sizeof(array[0]) * arrayLen);
    }

    return bytesSent;
}

然后你必须在 send 上编写一个循环,它获取数组的长度,分配一个该大小的数组,并在 recv() 收集数组时循环。

只要您的客户端和服务器都具有相同的字节顺序,您就不需要进行任何额外的处理,因为两台机器都具有相同的数据格式。由于您的问题被标记为 Windows,我认为是这种情况。

关于c++ - 通过 Winsocks 发送一个 int 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2687961/

相关文章:

windows - 用于创建简单 Microsoft Windows GUI 的 Perl 模块?

windows - 在 x64 64 位 Windows 上使用 NASM(和 GoLink)的 Hello World

networking - 使用主机 DNS 服务器的 Docker-compose 容器

java - 使用 Java 验证网络上的随机 URL

C++ GCC 为什么这段 sfinae 代码可以用 GCC 4.7 编译,但不能用 4.8 编译?

c++ - G++ - 未定义对已定义成员函数的引用

c++ - 如何让 Visual C++ 2010 识别声明 "_extension"

linux - Windows 10 Linux 子系统。如何安装 MongoDB

windows - RN-42 断开 SPP 配置文件上的连接

c++ - Cmake:无法打开没有这样的文件或目录的输出文件