簡體   English   中英

通過網絡發送的填充結構

[英]Padded structure sent over the network

如果我有一個像

struct MixedStructure{
char a;
short b;
int c;
char d;
};

填充將生效。

我想知道的是,通過網絡發送這種結構是否有問題。

我的意思是,由於填充,此結構實際上有12個字節(而不是8個字節)。 如果在另一端使用另一種填充方案(或不使用填充方案),將產生什么影響?

如果您使用的是GCC,請使用__packed__屬性:

#define PACKED __attribute__((__packed__))
struct PACKED MixedStructure { ... };

如果您使用的是Windows,請使用pragma

#pragma pack(push, 1)
struct MixedStructure { ... };
#pragma pack(pop)

如果要對齊,也可以使用顯式填充:

#include <stdint.h>
#define PACKED __attribute__((__packed__))
struct PACKED MixedStructure {
    int8_t a;
    int8_t pad0; /* added for alignment */
    int16_t b;
    int32_t c;
    int8_t d;
    int8_t pad1[3]; /* added for alignment */
};

我還建議如上所述使用顯式寬度類型。

那不是你唯一的問題。 您怎么知道在構造該結構的兩個盒子之間sizeof(int)或sizeof(short)將保持一致?

大多數編譯器都有指定固定大小變量的方法 (即uint32_t)。 為了回答您的特定問題,大多數編譯器還提供了指定packing的方法

在高性能網絡編程中,將結構覆蓋到字節緩沖區是一種非常常見的習慣用法,但可能會遇到危險。 您還需要了解這種習語如何違反嚴格的鋸齒以及什么是忍耐

我知道,在非常高性能的情況下,這是最佳選擇。 只是非常非常小心,並在可能一起通信的所有潛在主機之間進行很好的測試。 如果您不需要這種性能,請檢查諸如google的協議緩沖區之類的內容 ,以一種非常有效的方式傳輸數據,這樣您就可以避免了解打包/字節序/等。

暫無
暫無

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

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