tcp/ip校验和计算

代码语言:javascript
复制
#include <cassert>
#include <cstdlib>

#include "network.h"

unsigned short ChecksumTcpUdp(unsigned int saddr, unsigned int daddr,
unsigned short len, unsigned char proto, const unsigned char *data)
{
assert(NULL != data);

const sniff_tcp *tcpHeader = (const sniff_tcp *)data;

unsigned char protoStr[2] = { 0x00, proto };
long sum = (saddr &amp; 0xffff) + (saddr &gt;&gt; 16) + (daddr &amp; 0xffff)
    + (daddr &gt;&gt; 16) + len + *(unsigned short *)protoStr;

int count = ntohs(len);

while (count &gt; 1) {
    sum += *(unsigned short *)data;
    data += 2;
    count -= 2;
}
if (count &gt; 0) {
    sum += *(unsigned char *)data;
}

/* Remove the existing checksum from result.
 */
sum -= tcpHeader-&gt;th_sum;

while (sum &gt;&gt; 16) {
    sum = (sum &amp; 0xffff) + (sum &gt;&gt; 16);
}

return ~sum;

}

unsigned short ChecksumIp(const unsigned char *addr, int count)
{
assert(NULL != addr);

const sniff_ip *ipHeader = (const sniff_ip *)addr;

long sum = 0;
while (count &gt; 1) {
    sum += *(unsigned short *)addr;
    addr += 2;
    count -= 2;
}
if (count &gt; 0) {
    sum += *(unsigned char *)addr;
}

/* Remove the existing checksum from result.
 */
sum -= ipHeader-&gt;ip_sum;

while (sum &gt;&gt; 16) {
    sum = (sum &amp; 0xffff) + (sum &gt;&gt; 16);
}

return ~sum;

}