Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ip结构C参数_C_Sockets_Struct - Fatal编程技术网

Ip结构C参数

Ip结构C参数,c,sockets,struct,C,Sockets,Struct,我在原始套接字中开始了一次冒险,我发现了一个我不理解的ip头,我的怀疑是 hdrlen:4 这两点四是用来做什么的 属性(压缩) 这个属性是什么 有一些,packed属性删除了填充 这两点四是用来做什么的 这“两点四”是指定的方式。它基本上要求使用那么多的位(这里是4)来表示变量的值 有关这方面的更多信息: 这个属性是什么 这是一个,使用它可以指示结构成员变量之间不应有填充。一般来说,\uuuuuu属性\uuuuuu用于帮助编译器优化函数和/或变量的某些属性 有关这方面的更多信息:

我在原始套接字中开始了一次冒险,我发现了一个我不理解的ip头,我的怀疑是

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