0

我正在阅读 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

4

1 回答 1

0

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

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

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

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

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

于 2013-10-23T15:43:14.030 回答