1、无伪首部的网际校验和算法的实现
unsigned short CheckSum(unsigned short* buf, int size)
{
unsigned long sum = 0;
while (size > 1)
{
sum += *buf++;
size -= sizeof(unsigned short);
}
if (size)
{
cksum += *(unsigned char*)buf;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return (unsigned short)(~sum);
}
2、含有伪首部的网际校验和算法的实现,如TCP校验、UDP校验
unsigned short CheckSum(const char* pData, const char* pPshData, unsigned int nCount)
{
unsigned short sCheckSum = ~CheckSum(pData, nCount);
unsigned long checkSum = sCheckSum;
checkSum <<= 16;
sCheckSum = ~CheckSum(pPshData, 12);
checkSum += sCheckSum;
return CheckSum((char*)&checkSum, 4);
}
禁止转载