checksum二进制反码求和计算方法:
ip报文:将首部不包含数据,分成多个16位字的序列,将检验和置零,然后进行反码算术运算把所有16位字相加后,将得到的 和的反码 写入检验和字段。接收方接收到后,再按照16位字的序列计算一次,得到的和为1,取反码为0.
udp:将ip首部,udp首部和数据部分一起检验,数据部分不是偶数个字节,则要填入一个全零字节,此字节不发送,计算方法同上。
unsigned short checksum(unsigned short *buf, int length) { unsigned long sum; for(sum = 0; length > 0; length--) { sum += *buf++; sum = (sum>>16) + (sum&0xffff); sum += (sum>>16); } return ~sum; }