linux之网络编程ICMP校验算法

1、ICMP校验算法代码

 

    unsigned short cal_chksum(unsigned short *addr,int len)  
    {       
	int nleft = len;  
        int sum = 0;  
        unsigned short *w = addr;  
        unsigned short answer =0;  
        /*把ICMP报头二进制数据以2字节为单位累加起来*/  
        while(nleft > 1)  
        {       
            sum += *w++;  
            nleft -= 2;  
        }     
        /*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/  
        if(nleft == 1)  
        {       
            *(unsigned char *)(&answer)=*(unsigned char *)w;  
            sum+=answer;  
        }     
        /*校验和是以16位为单位进行求和计算的,sum是32位的,sum&0xffff是低16位,sum>>16是右移16位,取到的是高16位,相加就是高16位和低16位的和。*/  
        sum = (sum >> 16) + (sum & 0xffff);  
        /*这一步是有可能上面加的时候有进位到高16位的,再把高16位加进来。*/    
        sum += (sum >> 16);  
        /*上一步肯定不会再有进位了,即使上面sum高16位非0也不要紧,此处sum只能把低字节数赋值给answer,因为answer为16位*/    
        answer =~ sum;  
        return answer;  
    }  

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码莎拉蒂 .

你的鼓励是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值