Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;int via socket send():Linux/MacOS上TCP包中的不同值 我有一个用C++编写的客户机/服务器应用程序。客户端发送一个包含三个int 32的结构(proxy_头)。这会触发服务器发回信息。问题是,如果客户机运行在OS X(El Capitan)上,服务器不会响应。Tcpdump显示发送的结构的不同值 < > C++代码如下:_C++_Linux_Macos_Sockets - Fatal编程技术网

C++;int via socket send():Linux/MacOS上TCP包中的不同值 我有一个用C++编写的客户机/服务器应用程序。客户端发送一个包含三个int 32的结构(proxy_头)。这会触发服务器发回信息。问题是,如果客户机运行在OS X(El Capitan)上,服务器不会响应。Tcpdump显示发送的结构的不同值 < > C++代码如下:

C++;int via socket send():Linux/MacOS上TCP包中的不同值 我有一个用C++编写的客户机/服务器应用程序。客户端发送一个包含三个int 32的结构(proxy_头)。这会触发服务器发回信息。问题是,如果客户机运行在OS X(El Capitan)上,服务器不会响应。Tcpdump显示发送的结构的不同值 < > C++代码如下:,c++,linux,macos,sockets,C++,Linux,Macos,Sockets,正在初始化发送到服务器的消息: struct { int m:32; int x:32; int y:32; } proxy_header; proxy_header.m = 0x02212102; proxy_header.x = 1; proxy_header.y = 1; 。。。 发送: 。。。 正在等待回答-recv(): 该程序在Linux上编译并运行良好。在MacOS上,我得到“接收失败…” tcpdumping包时,我发现了以下内容: 在Ubuntu上,我可以看到一个SYN/AC

正在初始化发送到服务器的消息:

struct { int m:32; int x:32; int y:32; } proxy_header;
proxy_header.m = 0x02212102;
proxy_header.x = 1;
proxy_header.y = 1;
。。。 发送:

。。。 正在等待回答-recv():

该程序在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吗?

解决这一问题的一种方法是在两侧(客户端和服务器端)使用独立于平台端的数据缓冲区。例如,您可以使用boost endian_缓冲区:

您的数据结构可能如下所示:

struct {
    little_int32_buf_t m;
    little_int32_buf_t x;
    little_int32_buf_t y;
} proxy_header;

当它失败时,
recv
返回什么?如果它返回
-1
,请使用
perror()
查看错误原因。我使用了errno,显然它没有失败,只是没有接收任何内容(0字节)。这是EOF,这意味着客户端在发送任何内容之前关闭了连接。是的,套接字会有序关闭。在TCPDUMP上,我还可以看到FIN包。服务器在完成之前不发送数据。。。这就引出了一个问题:客户端是否发送了正确的init消息。如果您发布tcpdump,可能会有所帮助。另外,如果同时在客户机和服务器上进行转储,您会发现有什么不同吗?这表示数据包丢失。我也在想同样的事情,但为什么这会导致
recv()
返回0字节,而不是返回具有错误值的结构?另一个修复方法是使用
htonl()
ntohl()
将数据转换为网络字节顺序或从网络字节顺序转换数据。@BMLT:好的,然后,您可以按照Barmar的评论,使用htonl()在客户端填充您的结构,使用ntohl()从服务器端的结构获取数据。@MBLT这真的解决了问题吗?我可以理解问题是否在于服务器正在验证数据,但这并不能解释为什么服务器根本没有接收任何数据。比方说,它为我提供了查找内容的想法。服务器接收一个数字作为发送数据的信号。如果号码错误,服务器将不发送任何内容,而是关闭连接。如果字节顺序错误,服务器将收到错误的数字。。。如果字节顺序是big-endian,我有一个预处理器指令来改变顺序。不管出于什么原因,Mac总是会遇到这种情况,即使它实际上是小endian。
char peer0_0[] = {
0x02, 0x21, 0x21, 0x02, 0x00, 0x00, 0x00, 0x01, 
0x00, 0x00, 0x00, 0x01 };
struct {
    little_int32_buf_t m;
    little_int32_buf_t x;
    little_int32_buf_t y;
} proxy_header;