qsc66886688
驱动牛犊
驱动牛犊
  • 注册日期2007-07-02
  • 最后登录2008-06-06
  • 粉丝0
  • 关注0
  • 积分320分
  • 威望43点
  • 贡献值0点
  • 好评度42点
  • 原创分0分
  • 专家分0分
阅读:1525回复:5

各位大虾帮忙看一下这个计算tcp校验和的函数到底行不行啊?

楼主#
更多 发布于:2007-10-15 20:30
short checksum(short *buffer, int size)
{
        unsigned long cksum=0;
        while(size >1)
        {
                cksum+=*buffer++;
                size -=sizeof(short);
        }  
        if(size )
        {  
                cksum += *(char*)buffer;
        }          

        cksum = (cksum >> 16) + (cksum & 0xffff);
        cksum += (cksum >>16);
        return (short)(~cksum);
}
用这个函数计算ip校验和正确,但一计算tcp校验和就出问题。计算的结果总是和原始的包的校验和不一样。在计算前我一将tcp得校验和设为0了。谢谢了!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-10-15 23:06
函数没问题,你的做法有问题!计算TCP的校验和,还要算上伪TCP头才行的。。具体的,你查一下文档。或者去看那本老外的<windows网络编程>
人不靓仔心灵美,版头不正红花仔!
mhy2727
驱动牛犊
驱动牛犊
  • 注册日期2007-10-27
  • 最后登录2009-02-12
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-10-28 18:22
两个函数不一样
我决不决不决不放弃 除非我真的错拉
yellowzzp
驱动小牛
驱动小牛
  • 注册日期2007-07-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1015分
  • 威望131点
  • 贡献值0点
  • 好评度117点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-12-27 15:09
tcp头+伪头 是32字节  你如果光算tcp头 是不对的
tcp/udp算校验 都得加上 伪头
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2007-12-27 22:03
引用第3楼yellowzzp于2007-12-27 15:09发表的  :
tcp头+伪头 是32字节  你如果光算tcp头 是不对的
tcp/udp算校验 都得加上 伪头

UDP不用加伪头计算的
人不靓仔心灵美,版头不正红花仔!
yellowzzp
驱动小牛
驱动小牛
  • 注册日期2007-07-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1015分
  • 威望131点
  • 贡献值0点
  • 好评度117点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-12-29 10:32
我刚刚去看了 tcp/ip详解 验证了下 11章里面说了得+啊 不过校验是可选的
游客

返回顶部