【问题标题】:calculate IP header len计算 IP 报头长度
【发布时间】:2012-12-17 19:50:06
【问题描述】:

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

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

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

【问题讨论】:

  • 一个常数值。你在问什么?
  • 你说得有道理。你能举出这些例子吗?有人只想要 struct ip 的 4 倍大小,我不看上下文就无法理解。
  • @pbhd,我想是大小的 1/4。

标签: c sockets ip


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-29
      • 2019-04-29
      • 1970-01-01
      • 2015-01-02
      • 2017-11-02
      • 1970-01-01
      • 2012-11-02
      • 2010-11-10
      相关资源
      最近更新 更多