unsigned short CIcmp::IcmpChecksum(unsigned short FAR *lpBuf, int Len)
{
register long ChkSum = 0L;
while (Len > 1)
{
ChkSum += *(lpBuf++);
Len -= sizeof (USHORT);
}
ChkSum = (ChkSum & 0xffff) + (ChkSum>>16);
ChkSum += (ChkSum >> 16);
上面两句有何意义? #pragma warning(disable : 4244)
return (~ChkSum);#pragma warning(default : 4244)}
其中 lpBuf是指icmp缓冲区,Len是指icmp数据报总长度。该函数的功能是计算icmp数据报
检验和(算法与ip协议计算校验和的算法相同即是16位二进制反码和的反码)
{
register long ChkSum = 0L;
while (Len > 1)
{
ChkSum += *(lpBuf++);
Len -= sizeof (USHORT);
}
ChkSum = (ChkSum & 0xffff) + (ChkSum>>16);
ChkSum += (ChkSum >> 16);
上面两句有何意义? #pragma warning(disable : 4244)
return (~ChkSum);#pragma warning(default : 4244)}
其中 lpBuf是指icmp缓冲区,Len是指icmp数据报总长度。该函数的功能是计算icmp数据报
检验和(算法与ip协议计算校验和的算法相同即是16位二进制反码和的反码)
先把icmp里的数据求校验和(就是加起来,有的连溢出了都不用管)ChkSum = (ChkSum & 0xffff) + (ChkSum>>16);
//ChkSum是2个字的,这句把高字和低字相加放到低字里,同时高字为0
//其实这就象上面说的,是为了防止溢出,有的作法都没有这两句,而且直接用USHORT ChkSum
ChkSum += (ChkSum >> 16);
//同上,还是解决上一步可能出现溢出的情况.因为最后返回的是USHORT型,所以高字中所有有意义的都校验和到低字上来.