我已经在原始套接字中开始了一次冒险,我找到了一个我不明白的ip标题,我怀疑是
这两点四用于什么?
这个属性是什么?
struct iphdr {
uint8_t hdrlen:4;
uint8_t version:4;
uint8_t ecn:2; // Explicit Congestion Notification - RFC 3168
uint8_t dscp:6; // DiffServ Code Point
uint16_t length;
uint16_t ident;
uint16_t fragoff:13;
uint16_t flags:3;
uint8_t ttl;
uint8_t protocol;
uint16_t checksum;
uint32_t srcip;
uint32_t dstip;
uint32_t options[ ]; // Present if hdrlen > 5
} __attribute__((__packed__));
答案 0 :(得分:4)
此结构表示将通过网络发送的数据包,因此您不希望浪费一点空间(因为每个位都需要通过“线路”发送)。
field_name:field_width
语法声明bit field,因此uint8_t hdrlen:4;
意味着您实际上只需要4位来存储“标头长度”值(但编译器将确保该值为在读取字段值时复制到uint8_t
(一个字节)。
__attribute__((__packed__))
语法告诉编译器忽略usual alignment requirements for structs。有时需要编译器在struct字段之间插入填充,以确保对struct中字段的有效内存访问。例如,如果在uint64_t
之后有uint8_t
,编译器将在两个字段之间插入填充(垃圾)以确保uint64_t
在8字节边界上开始(即,指针地址的最后3位全为零。
正如你所看到的,所有这一点都在完成,以便在这个结构中没有浪费的空间,并且通过网络发送的每一位都是有意义的。
答案 1 :(得分:0)
有一些padding in structs that is required for alignment requirements,packed
属性会删除填充。
答案 2 :(得分:0)
这两点四用于什么?
这个"两点四" 是指定bit-fielded variables的方式。它基本上要求使用那么多位(这里是4
)来表示变量的值。
更多相关信息:Previous answer
这个属性是什么?
这是special property,使用它表示结构成员变量中不应该有填充。通常,__attribute__
用于帮助编译器优化函数和/或变量的某些属性。
更多相关内容: