簡體   English   中英

通過套接字send()的C ++ int:Linux / MacOS上TCP包中的不同值

[英]C++ int via socket send(): differnent value in TCP package on Linux / MacOS

我有一個用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上,我收到“無法接收...”。

通過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到服務器的ACK都發生了相同的情況。 然后,服務器僅發送FIN。

這是推送包含的內容:

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

顯然是不同的...為什么?

看起來像個字節序問題(反轉的數據字節)。

考慮到從MAC OS客戶端發送時得到的內容,數據格式接縫為“大端”格式,而服務器可能使用“小端”格式。 (運行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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM