1

我正在尝试构建 ICMP 数据包并通过原始套接字发送它。查看示例,我看到 IP 数据包长度计算为:

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

您能解释一下为什么我们需要将 struct ip 右移 2 次而不是分配一个常量值吗?

4

2 回答 2

3

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

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

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

于 2012-12-17T19:56:50.317 回答
1

因为 4-bit header length 字段是 header 中32-bit 字的数量,包括 options,所以它可能长于 20 个字节(字段值 5),所以它不应该是一个常量值。您的示例只是假设没有选项场景。

于 2012-12-17T19:54:14.437 回答