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