C++int via socket send():Linux/MacOS上TCP包中的different值
C++ int via socket send(): differnent value in TCP package on Linux / MacOS
我有一个用C++编写的Client/Server应用程序。客户端发送一个包含三个int 32的结构(proxy_header)。这会触发服务器发回信息。问题是,如果客户端运行在OS X(El Capitan)上,服务器不会回复。Tcpdump显示发送的结构的不同值。
C++代码如下:
初始化发送到服务器的消息:
struct { int m:32; int x:32; int y:32; } proxy_header;
proxy_header.m = 0x02212102;
proxy_header.x = 1;
proxy_header.y = 1;
发送:
{ int r;
if ((r = send(t->fd, (void*)&proxy_header, sizeof(proxy_header), 0)) != sizeof(proxy_header)) {
error("Failed to send proxy header (%d != %d)", r, sizeof(proxy_header));
goto error;
}
正在等待答案-recv():
if ((r = recv(t->fd, (void*)&(proxy_answer), sizeof(proxy_answer), MSG_WAITALL)) != sizeof(proxy_answer)) {
printf("Failed to receive ...")
}
else {
printf("Successfully received...");
}
该程序可在Linux上编译并运行良好。在MacOS上,我得到"接收失败…"。
tcpdump包,我发现了以下内容:
在Ubuntu上,我可以看到SYN/ACK,然后从客户端到服务器的PSH响应ACK,然后从服务器到客户端的PSH回应ACK。
第一次推送(来自客户端)包含以下内容:
char peer0_0[] = { /* Packet 4 */
0x02, 0x21, 0x21, 0x02, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00 };
在MacOS上,同样的情况发生在客户端的第一个PSH之前,该PSH被服务器确认。然后服务器只发送一个FIN。
这就是推送包含的内容:
char peer0_0[] = {
0x02, 0x21, 0x21, 0x02, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x01 };
显然不同。。。为什么?
这看起来像是endianness(反向数据字节)的问题
考虑到从MAC操作系统客户端发送数据时会得到什么,数据格式可能是"big-endian",而服务器可能使用"little-endian"格式。(运行MAC操作系统的计算机是PowerPC吗?)
https://en.wikipedia.org/wiki/Endianness
解决此问题的一种方法是在双方(客户端和服务器)使用独立于平台端序的数据缓冲区。例如,您可以使用boost endian_buffers:
http://www.boost.org/doc/libs/1_58_0/libs/endian/doc/buffers.html
您的数据结构可能如下所示:
struct {
little_int32_buf_t m;
little_int32_buf_t x;
little_int32_buf_t y;
} proxy_header;
- node-gyp 在 macOS 上未正确链接库
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- MacOS通过在莫哈韦"wchar.h"下破碎的自制啤酒发出叮当声
- 从对象文件(.o)在macos上制作归档文件(.a文件)
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- macOS 上的 openvino 构建问题
- 为什么 __gcd() 在 macOS mojave 中抛出错误?
- 通过TCP的PvP通信问题
- 如何在 macOS 卡塔琳娜上解决此错误?
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- 在macOS Mojave上发布BOOST unit_test_framework/Google测试
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码
- C++int via socket send():Linux/MacOS上TCP包中的different值