通过网络发送的填充结构

时间:2012-09-06 15:19:22

标签: c network-programming padding

如果我有像

这样的结构

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

填充将生效。

我想知道的是,如果在网络上发送这样的结构时出现问题。

我的意思是,由于填充,这个结构实际上有12个字节(而不是8个)。如果在另一端使用另一个填充方案(或没有),那么会产生什么影响?

2 个答案:

答案 0 :(得分:2)

如果您使用的是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 */
};

我还建议使用如上所述的显式宽度类型。

答案 1 :(得分:2)

这不是你唯一的问题。你怎么知道sizeof(int)或sizeof(short)在构建该结构的两个框之间是否一致?

大多数编译器都有指定fixed-size variables的方法(即uint32_t)。要回答您的具体问题,大多数编译器还可以指定packing

将结构覆盖到字节缓冲区是高性能网络编程中非常常见的习惯用法,但可能会带来危险。您还需要了解这个习语如何违反strict-aliasing以及endianess是什么。

我知道在非常高性能的情况下,这是最好的选择。只是非常小心,并在可能通信的所有潜在主机之间进行非常好的测试。如果您不需要这种性能,请查看google's protocol buffers之类的内容,以便以相当高效的方式传输数据,以避免了解打包/结束/等。