关于checksum校检和的计算.
通常ip,或者,tcp,udp的校检和要先统计整个ip头,或者整个tcp,udp数据包的数据.
我有个想法,我截获了数据包,并改动了源地址,目标地址
但是我不想再重新统计整个数据包来计算checksum了,我想在原来的checksum基础上
根据我改的源地址和目标地址的改变偏移来计算checksum,不知道这可不可以
但是我发现checksum的函数经过了移位,会有数据丢失,有那位大侠有高招能够很好的处理这些问题呢?
标准checksum计算函数
USHORT CNetwork::CheckSum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}