电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

checksum计算方法

checksum计算方法_第1页
1/7
checksum计算方法_第2页
2/7
checksum计算方法_第3页
3/7
ICMP, IP,UDP,TCP 报头部分都有checksum(检验和)字段。ICMP 和 IP 报头校验和的计算都很简单,使用RFC1071 中给出的方法即可完成(如下)。 //计算校验和 USHORT checksum(USHORT *buffer,int size) { unsigned long cksum=0; while(size>1) { cksum+=*buffer++; size-=sizeof(USHORT); } if(size) { cksum+=*(UCHAR *)buffer; } //将 32 位数转换成16 while (cksum>>16) cksum=(cksum>>16)+(cksum & 0xffff); return (USHORT) (~cksum); } UDP/TCP 报头中的校验和的计算比较复杂的,要用到 UDP/TCP 伪首部:先要填充伪首部各个字段,然后再将UDP/TCP 报头以后(包括报头)的数据附加到伪首部的后面,再对位首部使用上述校验和计算,所得到的值才是UDP/TCP 报头部分的校验和。 位首部可以用如下的结构体表示: typedef struct{ ULONG sourceip; //源 IP 地址 ULONG destip; //目的IP 地址 BYTE mbz; //置空(0) BYTE ptcl; //协议类型 USHORT plen; //TCP/UDP 数据包的长度(即从TCP/UDP 报头算起到数据包结束的长度 单位:字节) }Psd_Header; 这个过程是一个很繁琐的过程,计算过几次后再也忍受不了做这样重复的工作,于是写了一个通用的计算函数。这个函数使用起来我感觉非常方便:先封装好你的数据包(完整的,包括以太头),然后将数据包的首地址作为参数,调用该函数即可。函数将帮你完成IP 报头以及UDP/TCP 报头部分校验和的计算。 //————————————————————————- // PacketCheckSum // 计算数据包的校验和 // 参数:packet-待处理数据(将封装好的数据包的指针) //————————————————————————- void PacketCheckSum(unsigned char packet[]) { Dlc_Header *pdlc_header=NULL; //以太头指针 Ip_Header *pip_header=NULL; //IP 头指针 unsigned short attachsize=0; //传输层协议头以及附加数据的总长度 pdlc_header=(Dlc_Header *)packet; //判断ethertype,如果不是IP 包则不予处理 if(ntohs(pdlc_header->ethertype)!=0×0800) return; pip_header=(Ip_Header *)(packet+14); //TCP 包 if(0×06==pip_header ->proto) { Tcp_Header *ptcp_header=NULL; //TCP 头指针 Tcp_Psd_Header *ptcp_psd_header=NULL; ptcp_header=(Tcp_Header *)(packet+14+((pip_header->ver_len)...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

checksum计算方法

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部