如果我有一個像通過網絡發送的
struct MixedStructure{
char a;
short b;
int c;
char d;
};
填充一個結構來影響軟墊結構。
我想知道的是,如果在網絡上發送這樣的結構有問題。
我的意思是,這個結構實際上有12個字節(而不是8個),因爲填充。如果在另一端使用另一種填充方案(或不使用),那會有什麼影響?
如果我有一個像通過網絡發送的
struct MixedStructure{
char a;
short b;
int c;
char d;
};
填充一個結構來影響軟墊結構。
我想知道的是,如果在網絡上發送這樣的結構有問題。
我的意思是,這個結構實際上有12個字節(而不是8個),因爲填充。如果在另一端使用另一種填充方案(或不使用),那會有什麼影響?
這不是你唯一的問題。你怎麼知道sizeof(int)或sizeof(short)在構建該結構的兩個盒子之間是一致的?
大多數編譯器都有方法來指定fixed-size variables(即uint32_t)。要回答您的具體問題,大多數編譯器也可以指定packing。
將結構覆蓋到字節緩衝區是高性能網絡編程中非常常見的一種習慣用法,但可能會產生危險。你還需要了解這個成語如何違反strict-aliasing以及endianess是什麼。
我知道在非常高性能的情況下,這是最好的選擇。只要非常小心,並且在可能一起通信的所有潛在主機之間進行非常好的測試。如果您不需要這種性能,請查看google's protocol buffers之類的東西,以便以非常高效的方式傳輸數據,從而避免瞭解包裝/字尾等問題。
如果您正在使用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 */
};
我也推薦使用explicit-widt h類型如上。
首先,謝謝你的回答。我知道關於endianess和包裝。在您回覆之後,我會問,您如何通過網絡將任何類型的數據正確發送給所有潛在的主機? – coredump
ASN.1 BER是另一個不錯的選擇。 – SquareRootOfTwentyThree