Ip结构C参数
我在原始套接字中开始了一次冒险,我发现了一个我不理解的ip头,我的怀疑是Ip结构C参数,c,sockets,struct,C,Sockets,Struct,我在原始套接字中开始了一次冒险,我发现了一个我不理解的ip头,我的怀疑是 hdrlen:4 这两点四是用来做什么的 属性(压缩) 这个属性是什么 有一些,packed属性删除了填充 这两点四是用来做什么的 这“两点四”是指定的方式。它基本上要求使用那么多的位(这里是4)来表示变量的值 有关这方面的更多信息: 这个属性是什么 这是一个,使用它可以指示结构成员变量之间不应有填充。一般来说,\uuuuuu属性\uuuuuu用于帮助编译器优化函数和/或变量的某些属性 有关这方面的更多信息:
- hdrlen:4
- 属性(压缩)李>
packed
属性删除了填充
这两点四是用来做什么的
这“两点四”是指定的方式。它基本上要求使用那么多的位(这里是4
)来表示变量的值
有关这方面的更多信息:
这个属性是什么
这是一个,使用它可以指示结构成员变量之间不应有填充。一般来说,\uuuuuu属性\uuuuuu
用于帮助编译器优化函数和/或变量的某些属性
有关这方面的更多信息:
此结构表示将通过网络发送的数据包,因此您不想浪费一位空间(因为每一位都需要通过“线路”发送)
field\u name:field\u width
语法声明了a,因此uint8\t hdrlen:4
意味着您实际上只需要4位来存储“header length”值(但编译器将确保在读取字段值时将该值复制到uint8\t
(一个字节)
\uuuuu属性((\uuuu packed\uuuuu))
语法告诉编译器忽略。编译器有时需要在结构字段之间插入填充,以确保对结构中字段的有效内存访问。例如,如果在uint8\u t
之后正好有一个uint64\u t
,编译器将在两个字段之间插入填充(垃圾),以确保uint64\u t
从8字节边界开始(即指针地址的最后3位均为零)
正如您所看到的,所有这些位的旋转和打包都是为了在这个结构中没有浪费空间,并且通过网络发送的每一位都是有意义的。可能的重复我不认为问题只是“这些是什么意思”,而是“为什么在这里使用这些?”-如果您不知道此结构使用位字段的原因,那么知道它使用位字段并没有多大用处。(“用于什么”==>什么和为什么)
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__));