计算IP头len

时间:2012-12-17 19:50:06

标签: c sockets ip

我正在尝试构建ICMP数据包并通过原始套接字发送它。看一下这些例子,我看到IP包的长度计算如下:

iphdr.ip_hl = sizeof(struct ip)>> 2

你能否解释为什么我们需要将struct ip右移2次而不是指定一个constan值?

2 个答案:

答案 0 :(得分:3)

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

sizeof(struct ip)以8位字节产生IP头的长度。右移这个值两次提供32位字的长度,正如ip_hl字段中预期的那样。

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

答案 1 :(得分:1)

因为4位标头长度字段是标头中 32位字的数量,包括选项 ,所以它可能长于20个字节(字段值) 5),所以它不应该是一个恒定的值。您的示例只假设没有选项方案。