我正在阅读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 *)"这会对字符数组产生什么影响。此外,我知道校验和算法是如何工作的,但我对实际代码感到困惑,以及为什么每个步骤都完成了。有人可以解释一下演员以及该剧中每一行的内容吗?
答案 0 :(得分:0)
我感到困惑的是数据报被转换为
的原因(unsigned short *)
它已转换为unsigned short *
,因为这是csum()
期望的类型。
这会对字符数组产生什么影响
它将被视为unsigned short
的数组(指向第一个元素的指针)而不是char
的数组,这使得代码调用未定义的行为,因为它现在正在访问一个对象通过不兼容的指针类型,违反了严格的别名规则。
除此之外,当这个csum()
函数工作似乎正在工作时,很可能会读取unsigned short
s,由原始{{1}的两个元素组成} array。