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?Ù