阅读:2286回复:1
kangzh,各位高手帮帮忙了,关于校验和的问题
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? } |
|
沙发#
发布于: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); |
|