星辰.Net技术社区论坛

首页 » .NET » 算法/数据结构 » C#实现IP数据包校验算法
admin - 2008-6-9 23:34:00
资料一:f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
IP头格式: f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 版本号 (4位) f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 IP头长度 (4位) f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 服务类型 (8位) f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 数据包长度 (16位) f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 标识段 (16位) f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 标志段 (16位) f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 生存时间 (8位) f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 传输协议 (8位) f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 头校验和 (16位) f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 发送地址 (16位) f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 目标地址 (16位) f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 选项 f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
 填充 f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
资料二:f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
IP 协议采用统一的校验算法,其计算比较简单:设校验和初值为0,然后对数据每16位求异或,结果取反,便得校验和。校验时将数据(含校验和)按同样的算法求和,结果为0则数据正确,不为0表示通讯出错,需要丢弃该数据包。f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
算法源代码:f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
  public static UInt16 checksum(UInt16[] buffer,int size)f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
  {f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
  Int32 cksum=0;f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
  int counter;f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
  counter=0;f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
  while(size>0)f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
  {f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
        UInt16 val=buffer[counter];f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
        cksum+=Convert.ToInt32(buffer[counter]);f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
        counter+=1;f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
        size=-1;f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
  }f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
  cksum=(cksum>>16)+(cksum&0xffff);f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
  cksum+=(cksum>>16);f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
  return (UInt16)(~cksum);f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
  }f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
注意:buffer数组为整个ip包数组,需要转换成UInt16[];size为buffer数组的长度。f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
关于byte[]转换成UInt16[]的方法比较简单,在此不介绍了。
f?(Û܌É4H@www.netcsharp.cnæX:CŠ?†—Ù
1
查看完整版本: C#实现IP数据包校验算法