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位二进制反码和的反码)

解决方案 »

  1.   

    这里sizeof(ChkSum)应该是32位的.
    先把icmp里的数据求校验和(就是加起来,有的连溢出了都不用管)ChkSum = (ChkSum & 0xffff) + (ChkSum>>16);
    //ChkSum是2个字的,这句把高字和低字相加放到低字里,同时高字为0
    //其实这就象上面说的,是为了防止溢出,有的作法都没有这两句,而且直接用USHORT ChkSum
    ChkSum += (ChkSum >> 16);                 
    //同上,还是解决上一步可能出现溢出的情况.因为最后返回的是USHORT型,所以高字中所有有意义的都校验和到低字上来.