ping源代码完全解析(2)

/* ***************************
*  计算icmp校验和算法
*  2008-05-02
* *************************
*/

unsigned 
short  chksum(addr,len)   
    unsigned 
short   * addr;   /*  校验数据开始地址(注意是以2字节为单位)  */    
    
int  len;                 /*  校验数据的长度大小,以字节为单位  */
{  
    
int  sum  =   0 ;         /*  校验和  */    
    
int  nleft  =  len;     /*  未累加的数据长度  */    
    unsigned 
short   * p;   /*  走动的临时指针,2字节为单位  */    
    unsigned 
short  tmp  =   0 /*  奇数字节长度时用到  */    
   
while ( nleft  >   1 )   
   {       
       sum 
+=   * p ++ ;     /*  累加  */        
       nleft 
-=   2 ;   
    }   
   
if (nleft  ==   1 )       /*  奇数字节长度  */    
   {       
       
* (unsigned  char   * ) & tmp  =   * ( & (unsigned  char   * )p);  /*  将最后字节压如2字节的高位  */        
       sum 
+=  tmp;   
   }  
    sum 
+=  (sum  >>   16 +  (sum  &   0xffff );     /*  高位低位相加  */    
    sum 
+=  sum  >>   16 ;                        /*  上一步溢出时,将溢出位也加到sum中  */    
    tmp 
=   ~ sum;      /*  注意类型转换,现在的校验和为16位  */     
    
return  tmp;
}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值