转载请注明原文链接,http://www.cnblogs.com/flyingcloude/p/6992326.html
对于IP头结构中checksum,一开始以为是通过CRC计算出来的,在TCP/IP协议中没有谈到有关这方面的知识。查资料之后,发现在RFC791里有说明。
计算45 00 00 1c 00 0b 00 00 80 01 (b7 53这个不要) c0 a8 01 17 c0 a8 01 1b
#include <stdio.h>
/*
*函数名称:check_sum
* 传入参数:unsigned char *ptr,指向需要计算checksum的unsigned char数组;
* int size,数组的长度,传入的数组的长度必须为偶数
* 返回:返回一个unsigned short的值
*/
unsigned short check_sum(unsigned char *ptr, int size)
{
if(size % 2 != 0)
{
return 0;
}
int cksum = 0;
int index = 0;
while(index < size)
{
cksum += *(ptr + index + 1);
cksum += *(ptr + index) << 8;
index += 2;
}
while(cksum > 0xffff)
{
cksum = (cksum >> 16) + (cksum & 0xffff);
}
return ~cksum;
}
int main()
{
unsigned char ptr[] = {0x45, 0x00, 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x00, 0x80, 0x01,
0xc0, 0xa8, 0x01, 0x17, 0xc0, 0xa8, 0x01, 0x1b};
printf("%x\n", check_sum(ptr, 18));
system("pause");
return 0;
}
计算得到b753
转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992326.html