赞
踩
check_sum计算:
1.校验和置0;
2.ip头部中(20字节),以两个字节为一组(short型),相加。
3.判断这个和是否超出了short型 的范围,如果超出了把超出部分与,下面的16位数相加;
4.最后对这个结果取反。
#include <stdio.h>
unsigned short check_sum(unsigned char *data, int len);//0xb88f
unsigned char data[1024] = {//下面这段数据是我们通过抓包程序,抓下来的(ip协议头)
0x45, 0x00,0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,0x00, 0x00, 0xc0, 0xa8, 0x00, 0x0f, 0xc0, 0xa8,0x00, 0xde
};}
unsigned short sum = check_sum(data, 20);//首地址与长度。
printf("sum is %x\n", sum);
unsigned short sum = 0;
unsigned int tmp = 0;
int i= 0;
for(i=0;i<len-1;i=i+2)//求和
{
tmp = tmp + ((data[i]<<8) + (data[i+1]));
}
while(tmp > 0x10000)//查看是否超出short型数据的范围。
{
tmp = ((tmp & 0xffff0000)>>16) + (tmp & 0xffff);
}}
return 0xffff-tmp;//取反
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。