gpt4 book ai didi

C++ int 通过套接字 send() : differnent value in TCP package on Linux/MacOS

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:58 26 4
gpt4 key购买 nike

我有一个用 C++ 编写的客户端/服务器应用程序。客户端发送一个包含三个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 上,我收到“无法接收...”。

通过 tcpdumping 包,我发现了以下内容:

Ubuntu 上,我可以看到一个 SYN/ACK,然后是从客户端到响应 ACK 的服务器的 PSH,然后是从服务器到响应 ACK 的客户端的 PSH。

第一次推送(来自客户端)包含以下内容:

char peer0_0[] = { /* Packet 4 */
0x02, 0x21, 0x21, 0x02, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00 };

MacOS 上,同样的情况会发生在客户端收到服务器确认的第一个 PSH 之前。然后服务器只发送一个 FIN。

这是推送包含的内容:

char peer0_0[] = {
0x02, 0x21, 0x21, 0x02, 0x00, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x01 };

显然它是不同的......为什么?

最佳答案

看起来像是字节序问题(反转数据字节)。

考虑到您从 MAC OS 客户端发送时得到的结果,数据格式接缝为“big-endian”,而服务器可能使用“little-endian”格式。 (运行MAC OS的电脑是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;

关于C++ int 通过套接字 send() : differnent value in TCP package on Linux/MacOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36960286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com