2012-12-17 83 views
1

我想帧ICMP数据包并通过原始套接字发送它。望着例子,我看到IP数据包长度的计算公式为:计算IP标题len

iphdr.ip_hl =的sizeof(结构IP)>> 2

能否请你解释为什么我们通过2需要右移结构IP次而不是分配一个constan值?

+1

*是一个常数值。你在问什么? –

+0

你有一点。你能展示这些例子吗?有人只需要4倍于struct ip的大小,这是我在看不到上下文的情况下无法理解的。 – pbhd

+0

@pbhd,大小的1/4,我想。 –

回答

3

IP(或ICMP)数据包的'ip_hl'字段被定义为IP数据头的长度,以32位字为单位。

sizeof(struct ip)产生IP报头的长度,以8位字节为单位。如同在ip_hl字段中预期的那样,将该值右移两次提供了32位字的长度。

一个不使用常量的好理由是消除源代码中的幻数。 (无论如何,编译器会为'sizeof(struct ip)>> 2')生成一个常量值。

1

由于4位标题长度字段是32位字头中的数,包括选项,所以它可能是长于20个字节(字段值5),因此它不应该是一个常数值。你的例子只是假设没有选择方案。