jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2223回复:1

kangzh,各位高手帮帮忙了,关于校验和的问题

楼主#
更多 发布于:2004-05-20 09:34
kangzh,这是你以前的校验和计算的一个程序段。我在调试创建一个UDP包,老是发现ip的校验和不对,我是用sniffer监控的,它在ip中显示,Headerchcksum =28cf,shoud be 0176;我想这就是校验和不对的征兆吧,看了一下你的程序,有些地方不是太懂,你说把USHORT sum=0;换为int sum=0;我试了一下,发现还是不行。再说校验码本来就是两个字节的,short就够了,为什么要用int呢?还有进行累加的时候,是不是先要把原来的IP段数据的校验码字段赋值为0,然后相加的时候这个字段也为0,而不是原来的数值。当然这个字段在创建的时候可能为0,如果你的pAddr结构为空的话。
USHORT Checksum(USHORT *pAddr, int len)
{
USHORT sum=0;
//这里是不是应该加个*(pAddr+5)=0;也就是将原来的校验码字段置0?
while(len>1)
{
sum+=*pAddr++;
len-=2;
}
if(len>0)
sum+=*(UCHAR *)pAddr;
//现面这两句不大懂,校验码字段的定义是:将IP数据收不看成为16bit的序列。现将检验和字段置零,将所有的16bit字相加后,将和的二进制反码写入检验和字段。为什么还要搞sum=(sum >> 16)+(sum & 0xffff);sum+=(sum >> 16);这两句,而不直接返回return (~sum)?
sum=(sum >> 16)+(sum & 0xffff);
sum+=(sum >> 16);
return (~sum) & 0xffff;//(~sum) & 0xffff不就是(~sum) 吗,如果sum是short,为什么还要搞个&0xffff?
}
mingfa
驱动牛犊
驱动牛犊
  • 注册日期2002-11-15
  • 最后登录2008-11-03
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望20点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-18 19:07
首先原来的校验码字段必须置0;
另外, sum 应该是一个DWORD, 因为16bit的序列和可能大于2的16次方, 这种情况下就要那两句话, 把高16位作为进位数加到低16位数

有人是这样写的, 可能更明了些
       // take only 16 bits out of the 32 bit sum and add up the carries
       while (sum>>16)
         sum = (sum & 0xFFFF)+(sum >> 16);
游客

返回顶部