代码语言: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 & 0xffff) + (saddr >> 16) + (daddr & 0xffff) + (daddr >> 16) + len + *(unsigned short *)protoStr; int count = ntohs(len); while (count > 1) { sum += *(unsigned short *)data; data += 2; count -= 2; } if (count > 0) { sum += *(unsigned char *)data; } /* Remove the existing checksum from result. */ sum -= tcpHeader->th_sum; while (sum >> 16) { sum = (sum & 0xffff) + (sum >> 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 > 1) { sum += *(unsigned short *)addr; addr += 2; count -= 2; } if (count > 0) { sum += *(unsigned char *)addr; } /* Remove the existing checksum from result. */ sum -= ipHeader->ip_sum; while (sum >> 16) { sum = (sum & 0xffff) + (sum >> 16); } return ~sum;
}