网络数据的校验

这里一个简单的网络校验,让我感到很迷惑:

USHORT 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);//这两行是否可以不要呢?不行是long
cksum += (cksum >>16);                            //
return (USHORT)(~cksum);
}

 

 

 

校验的原理是:把各个字段的值相加,然后对他的和进行取反!假设和为SUM,则结果为 ~SUN

一般书上说:如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该全是1.

其实就是在收到数据后对各个字段进行相加,然后和校验值相加,这里假设为SUM_RECV。如果没有错误,应该和前面的~SUM相等。他们相加的话各字段自然为1

 

UDP中,参与计算CHEKCSUM的数据包括三部分: UDP头部+数据部分+(4byte源IP地址 + 4byte目的IP地址 + 0x00 + 1byte协议 + UDP长度(2byte))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值