UDP校验方法:
UDP的CHECKSUM算法与IP包的HEADER CHECKSUM的计算方法基本一样,只是取样数据不同。
UDP中,参与计算CHEKCSUM的数据包括三部分: 亚头部+UDP头部+数据部分
亚头部包括:4byte源IP地址 + 4byte目的IP地址 + 0x00 + 1byte协议 + UDP长度(2byte)
UDP包头:2byte源端口+2byte目的端口+2byteUDP包长+0x0000(checksum)
数据部分
计算方法,以2字节为一个单位,将其顺序相加,就会产生2个字节的SUM,如果超过2字节,则将高位的值再加回低位,然后取补,得到的就是UDP的checksum
{
#define UDP_ALEN 4
struct udphdr *pUdphdr = (struct udphdr *)((char *)pIp + TTPS_IP_HEAD_LEN);
WORD* pUs = NULL;
DWORD ulCheckSum = 0;
int iLen = 0;
int i = 0;
iLen = ntohs(pUdphdr->uh_ulen);
ulCheckSum = 0;
pUs = (unsigned short *)&pIp->ip_src;
for (i=0; i<UDP_ALEN; ++i)
ulCheckSum += *pUs++;
pUs = (unsigned short *)pUdphdr;
ulCheckSum += htonl(IPPROTO_UDP + iLen); /* 17, UDP protocol */
while (iLen > 1)
{
ulCheckSum += *pUs++;
iLen -=2;
}
if (iLen > 0)
{
ulCheckSum += * (unsigned char *) pUs;
}
/* Fold 32-bit sum to 16 bits */
ulCheckSum = (ulCheckSum >> 16) + (ulCheckSum & 0xffff);
ulCheckSum += (ulCheckSum >> 16);
return (unsigned short)(~ulCheckSum);
}