【问题标题】:Code Explanation of IP Checksum function by Mixter (C & Linux)Mixter的IP校验和功能代码说明(C&Linux)
【发布时间】:2013-10-23 15:36:15
【问题描述】:

我正在阅读 Mixter 著名的关于原始 UDP 套接字的网络教程,在阅读源代码时我对这个功能感到困惑:

     unsigned short     /* this function generates header checksums */
     csum (unsigned short *buf, int nwords)
     {
              unsigned long sum;
              for (sum = 0; nwords > 0; nwords--)
              sum += *buf++;
              sum = (sum >> 16) + (sum & 0xffff);
              sum += (sum >> 16);
              return ~sum;
     }

函数有一个空字符数组传递给它:

    char datagram[4096];

它应该“包含 ip 标头、tcp 标头和有效负载”。它还有一个整数传递给它,即“nwords”。函数调用如下:

    iph->ip_sum = csum ((unsigned short *) datagram, iph->ip_len >> 1);

其中“iph->ip_len”是 ip 标头的总长度。我感到困惑的是数据报被转换为“(无符号短*)”的原因以及这会对字符数组产生什么影响。另外,我知道校验和算法是如何工作的,但是我对实际代码以及为什么要完成每个步骤感到困惑。有人可以解释一下转换以及函数中每一行的作用吗?

这是教程:http://www.cs.binghamton.edu/~steflik/cs455/rawip.txt

【问题讨论】:

  • 我感觉上面的代码只适用于大端硬件。 (或者:little endian 会给出不同的结果)缓冲区还需要(由调用者)用 NUL 字符填充到偶数边界。

标签: c raw-sockets


【解决方案1】:

我很困惑的是数据报被强制转换为(unsigned short *)的原因

它被转换为 unsigned short *,因为这是 csum() 所期望的类型。

以及这会对字符数组产生什么影响

它将被视为unsigned shorts 的数组(指向第一个元素的指针)而不是chars 的数组,这使得代码调用未定义的行为,因为它现在通过指针类型不兼容,违反严格的别名规则。

除此之外,当这个csum() 函数works 似乎正在工作时,它很可能读取unsigned shorts,由原始char 数组的两个元素组成。

【讨论】:

  • OP:那么合适的调用是什么?
猜你喜欢
  • 2018-01-14
  • 1970-01-01
  • 2016-06-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 2014-04-17
  • 2012-03-24
相关资源
最近更新 更多