我想帧ICMP数据包并通过原始套接字发送它。望着例子,我看到IP数据包长度的计算公式为:计算IP标题len
iphdr.ip_hl =的sizeof(结构IP)>> 2
能否请你解释为什么我们通过2需要右移结构IP次而不是分配一个constan值?
我想帧ICMP数据包并通过原始套接字发送它。望着例子,我看到IP数据包长度的计算公式为:计算IP标题len
iphdr.ip_hl =的sizeof(结构IP)>> 2
能否请你解释为什么我们通过2需要右移结构IP次而不是分配一个constan值?
IP(或ICMP)数据包的'ip_hl'字段被定义为IP数据头的长度,以32位字为单位。
sizeof(struct ip)产生IP报头的长度,以8位字节为单位。如同在ip_hl字段中预期的那样,将该值右移两次提供了32位字的长度。
一个不使用常量的好理由是消除源代码中的幻数。 (无论如何,编译器会为'sizeof(struct ip)>> 2')生成一个常量值。
由于4位标题长度字段是32位字头中的数,包括选项,所以它可能是长于20个字节(字段值5),因此它不应该是一个常数值。你的例子只是假设没有选择方案。
*是一个常数值。你在问什么? –
你有一点。你能展示这些例子吗?有人只需要4倍于struct ip的大小,这是我在看不到上下文的情况下无法理解的。 – pbhd
@pbhd,大小的1/4,我想。 –