将结构写入套接字

时间:2017-03-17 22:33:44

标签: c struct padding

所以我有一些结构包含我想要使用unix套接字发送到另一个进程的数据。此过程可能无法使用相同的编译器版本进行编译,或者甚至可以使用C语言编写。这是结构(注意某些东西被注释掉了):

struct nested_struct {
    uint8_t a;
    uint8_t b;
    uint16_t c;
} */__attribute__((packed))*/;

struct my_struct {
    uint32_t num_nested_structs;

    /* uint8_t padding[3];*/
    uint8_t   x;
    uint16_t  y;
    uint16_t  z;

    struct nested_struct nested[];
} /*__attribute__((packed))*/;

为了方便和表现,我想躲过像

这样的事情

write(socket, &data.x, data.num_nested_structs * sizeof(struct nested_struct) + 5)

或其他什么 - 但我怀疑这是安全的,因为struct my_struct没有很好地对齐。但是如果我们取消注释打包属性怎么样?这感觉它应该可以工作,但我已经读过按地址引用__packed__结构中的字段可能很危险。

如果我们取消注释uint8_t padding[3];字段会怎样?现在两个结构都是字大小对齐的(在具有WORD_BIT = 32的系统上)。假设编译器在这种情况下不会添加任何填充是否安全?如果是这样,这是否足以确保从5 + 4*num_nested_structs开始访问&my_struct.x字节的内存是安全的?

0 个答案:

没有答案