IP数据包的校验和算法C#版(原)

it2022-05-09  32

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

转载于:https://www.cnblogs.com/tuyile006/archive/2006/12/06/583949.html

相关资源:数据结构—成绩单生成器

最新回复(0)