Mixter(C& Linux)的IP校验和功能的代码说明

时间:2013-10-23 15:36:16

标签: c raw-sockets

我正在阅读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标头的总长度。令我困惑的是数据报被转换为"(unsigned short *)"这会对字符数组产生什么影响。此外,我知道校验和算法是如何工作的,但我对实际代码感到困惑,以及为什么每个步骤都完成了。有人可以解释一下演员以及该剧中每一行的内容吗?

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

1 个答案:

答案 0 :(得分:0)

  

我感到困惑的是数据报被转换为(unsigned short *)

的原因

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

  

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

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

除此之外,当这个csum()函数工作似乎正在工作时,很可能会读取unsigned short s,由原始{{1}的两个元素组成} array。