这里使用算法和IP头部校验算法一致
计算CheckSum:将报文CheckSum字段初始化为0,将整个报文使用下列get_checksum()函数进行计算,将其结果填入报文的CheckSum字段。
校验CheckSum:将整个报文使用下列get_checksum()函数进行计算,若计算结果为0,则校验正确,否则校验失败。
计算/校验算法:
unsigned short get_checksum(const char *buf, int size)
{
unsigned short *buffer = (unsigned short *)buf;
if (buffer == NULL) return 0;
unsigned int cksum = 0;
while (size > 1) {
cksum += *buffer++;
size -= sizeof(unsigned short);
}
if (size) {
char tmp[2]={0};
tmp[0] = *(char *)buffer;
cksum += *(unsigned short *)tmp;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (unsigned short)(~cksum);
}