关于IP校验算法的疑惑

leaber 2004-12-10 12:49:23
IP的校验算法:
置0把被校验的数据16位进行累加,然后取反码,若数据字节长度为奇数,则数据尾部补一个字节的0以凑成偶数。
但是实现代码对为奇数的情况,好象并没有补零,只是转为BYTE后累加。代码如下:
if( nleft==1)
{ *(unsigned char *)(&answer)=*(unsigned char *)w;
sum+=answer;

所以很困惑,为什么理论和实现不一致? 是不是理解错了。

请各位指点
...全文
87 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
leaber 2004-12-11
  • 打赏
  • 举报
回复
结帐了,自己搞清楚了。要考虑网络字节顺序, 所以最好还是自己抓包分析一下!
leaber 2004-12-10
  • 打赏
  • 举报
回复
顶一下。
leaber 2004-12-10
  • 打赏
  • 举报
回复
上面的也是一样的,并没有在后面补0来实现。难道是理论错误码了!
不过这样算出来的却是正确的。 真是想不明白..
Hendy_So 2004-12-10
  • 打赏
  • 举报
回复
经典的检验函数:
unsigned short checksum(USHORT *buffer,int size)
{
unsigned long cksum=0;
while(size>1)
{
cksum+=*buffer++;
size-=sizeof(unsigned short);
}
if(size)
cksum+=*buffer;
cksum=(cksum>>16)+(cksum & 0xffff);
cksum+=(cksum>>16);
return (unsigned short)(~cksum);
}

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧