解析IPV4报文
和IPV6 报文的
checksum 的算法:
校验和(checksum)算法,简单的说就是16位累加的反码运算:
计算函数如下:
我们在计算时是主机字节序,计算的结果封装成IP包时是网络字节序,注意这两者之间的区别,我们在从IP包里读取要转化为主机字节序,往IP包里存入时要转化为网络字节序在存入。
UINT32 Checksum(UINT32 cksum, VOID
*pBuffer, UINT32 size)
{
INT8 num = 0;
UINT8 *p = (UINT8 *)pBuffer;
if
((NULL == pBuffer) || (0 == size))
{
return cksum;
}
while (size > 1)
{
cksum += ((UINT16)p[num]
<< 8 & 0xff00) |
(UINT16)p[num + 1] & 0x00FF;
2个字节累加,先取网络字节序低位左移8位(变成主机字节序高位),与(加)上 网络字节序中的高位(主机字节序地位),即网络字节序要先变成主机字节序在进行累加,
size -= 2;
num +=
2;
}
if (size
> 0)<