![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
这个ip校验和代码是什么意思看不懂!求高手!c语言版的! 5
shortchecksum(ushortbufferintsize)//这两个变量是什么意思类型为什么要这样定义?????{unsignedlongcksum=0//类型...
short checksum(ushort buffer int size)//这两个变量是什么意思 类型为什么要这样定义?????
{
unsigned long cksum = 0 //类型为什么要定义成long????????
while(size> 1)//为什么size要大于1
{
cksum += buffer++ //???????????
size -= sizeof(ushort) //???????????
}
if(size)
{
cksum += (uchar)buffer
}
cksum = (cksum> > 16) + (cksum& 0xffff) //将高16bit与低16bit相加(&与运算把最高位去除 得到他的后16位)(整数移位后会只取整数部分)
cksum += (cksum> > 16) //将进位到高位的16bit与低16bit 再相加,为什么这里不进行与运算????
return (ushort)(~cksum) //~取反(转换成短整型)
} 展开
{
unsigned long cksum = 0 //类型为什么要定义成long????????
while(size> 1)//为什么size要大于1
{
cksum += buffer++ //???????????
size -= sizeof(ushort) //???????????
}
if(size)
{
cksum += (uchar)buffer
}
cksum = (cksum> > 16) + (cksum& 0xffff) //将高16bit与低16bit相加(&与运算把最高位去除 得到他的后16位)(整数移位后会只取整数部分)
cksum += (cksum> > 16) //将进位到高位的16bit与低16bit 再相加,为什么这里不进行与运算????
return (ushort)(~cksum) //~取反(转换成短整型)
} 展开
2个回答
展开全部
这个应该是ICMP协议的checksum
short checksum(ushort buffer int size) //这里定义的是指针吧 unsigned short *buffer,为ICMP的协议类型ICMP_ECHO值为8,size为发送封包大小,因为ip header占20字节,所以你发送一个最短的64bytes的数据包,size为44
unsigned long cksum = 0 //32位系统占4个字节,32个位,后面有低位和高位运算
while(size> 1)//为什么size要大于1
{
cksum += buffer++ //这个应该是cksum += *buffer++,指针偏移
size -= sizeof(ushort) //size -= 2,判断循环执行次数
}
if(size)
{
cksum += (uchar)buffer //如果packet为奇数,例如65,那个再加一次buffer
}
cksum = (cksum> > 16) + (cksum& 0xffff) //将高16bit与低16bit相加(&与运算把最高位去除 得到他的后16位)(整数移位后会只取整数部分)
cksum += (cksum> > 16) //将进位到高位的16bit与低16bit 再相加,为什么这里不进行与运算????
return (ushort)(~cksum) //~取反(转换成短整型)
}
short checksum(ushort buffer int size) //这里定义的是指针吧 unsigned short *buffer,为ICMP的协议类型ICMP_ECHO值为8,size为发送封包大小,因为ip header占20字节,所以你发送一个最短的64bytes的数据包,size为44
unsigned long cksum = 0 //32位系统占4个字节,32个位,后面有低位和高位运算
while(size> 1)//为什么size要大于1
{
cksum += buffer++ //这个应该是cksum += *buffer++,指针偏移
size -= sizeof(ushort) //size -= 2,判断循环执行次数
}
if(size)
{
cksum += (uchar)buffer //如果packet为奇数,例如65,那个再加一次buffer
}
cksum = (cksum> > 16) + (cksum& 0xffff) //将高16bit与低16bit相加(&与运算把最高位去除 得到他的后16位)(整数移位后会只取整数部分)
cksum += (cksum> > 16) //将进位到高位的16bit与低16bit 再相加,为什么这里不进行与运算????
return (ushort)(~cksum) //~取反(转换成短整型)
}
![](https://ecmc.bdimg.com/public03/b4cb859ca634443212c22993b0c87088.png)
2023-10-24 广告
SmartProxy企业级海外住宅IP代理服务商,覆盖全球200+国家和地区,高匿稳定,动态住宅代理/静态住宅代理/账密提取,100%原生住宅IP,城市级定位,支持HTTP/HTTPS/SOCKS5协议,不限带宽,纯净高匿,网络集成更快捷,...
点击进入详情页
本回答由SmartProxy提供
展开全部
你的代码不太正确,看下面代码及解释:
unsigned short checksum(unsigned short *buffer,int size) //校验和的求法
{
unsigned long cksum=0;
while(size>0) //各位求和
{
cksum+=*buffer++;
size-=sizeof(unsigned short);
}
if(size)
cksum+=*(unsigned char *)buffer;
cksum=(cksum>>16)+(cksum & 0xffff); //移位,位与运算
cksum+=(cksum>>16);
return (unsigned short)(~cksum); //再取反
}
unsigned short checksum(unsigned short *buffer,int size) //校验和的求法
{
unsigned long cksum=0;
while(size>0) //各位求和
{
cksum+=*buffer++;
size-=sizeof(unsigned short);
}
if(size)
cksum+=*(unsigned char *)buffer;
cksum=(cksum>>16)+(cksum & 0xffff); //移位,位与运算
cksum+=(cksum>>16);
return (unsigned short)(~cksum); //再取反
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询