Ip Struct C参数

时间:2015-06-29 16:40:24

标签: c sockets struct

我已经在原始套接字中开始了一次冒险,我找到了一个我不明白的ip标题,我怀疑是

  • hdrlen:4
  

这两点四用于什么?

  • 属性((的包装));
  

这个属性是什么?

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__));

3 个答案:

答案 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 requirementspacked属性会删除填充。

答案 2 :(得分:0)

  

这两点四用于什么?

这个"两点四" 是指定bit-fielded variables的方式。它基本上要求使用那么多位(这里是4)来表示变量的值。

更多相关信息:Previous answer

  

这个属性是什么?

这是special property,使用它表示结构成员变量中不应该有填充。通常,__attribute__用于帮助编译器优化函数和/或变量的某些属性。

更多相关内容:

  1. GNU docs on Variable-attributes
  2. Structure padding