📄 as_tcpip.h
字号:
#ifndef __AS_TCPIP_H__
#define __AS_TCPIP_H__
//////////////////////////////////////////////////////////////////////////
//计算效验和函数,先把IP首部的效验和字段设为0(IP_HEADER.checksum=0)
//然后计算整个IP首部的二进制反码的和。
//////////////////////////////////////////////////////////////////////////
u_int16 checksum(u_int16 *buffer, u_int32 size)
{
u_int32 cksum=0;
while (size >1) {
cksum+=*buffer++;
size-=2;
}
if (size) cksum += *(u_int8*) buffer;
cksum = (cksum >> 16) + (cksum&0xffff);
cksum += (cksum >> 16);
return (u_int16) (~cksum);
}
//////////////////////////////////////////////////////////////////////////
// 计算TCP检验和的函数
//////////////////////////////////////////////////////////////////////////
void ComputeTcpPseudoHeaderChecksum(IPHeader *pIphdr, TCPHeader *pTcphdr,
u_int8 *payload, u_int32 payloadlen)
{
u_int8 *buff = (u_int8 *) malloc(1024+payloadlen);
u_int8 *ptr=buff;
u_int32 chksumlen = 0;
u_int32 zero = 0;
// 伪头
// 包含源IP地址和目的IP地址
memcpy(ptr, &pIphdr->ipSource, sizeof(pIphdr->ipSource));
ptr += sizeof(pIphdr->ipSource);
chksumlen += sizeof(pIphdr->ipSource);
memcpy(ptr, &pIphdr->ipDestination, sizeof(pIphdr->ipDestination));
ptr += sizeof(pIphdr->ipDestination);
chksumlen += sizeof(pIphdr->ipDestination);
// 包含8位0域
memcpy(ptr, &zero, 1);
ptr += 1;
chksumlen += 1;
// 协议
memcpy(ptr, &pIphdr->ipProtocol, sizeof(pIphdr->ipProtocol));
ptr += sizeof(pIphdr->ipProtocol);
chksumlen += sizeof(pIphdr->ipProtocol);
// TCP长度
u_int16 tcp_len = htons(sizeof(TCPHeader) + payloadlen);
memcpy(ptr, &tcp_len, sizeof(tcp_len));
ptr += sizeof(tcp_len);
chksumlen += sizeof(tcp_len);
// TCP头
memcpy(ptr, pTcphdr, sizeof(TCPHeader));
ptr += sizeof(TCPHeader);
chksumlen += sizeof(TCPHeader);
// 净荷
memcpy(ptr, payload, payloadlen);
ptr += payloadlen;
chksumlen += payloadlen;
// 补齐到下一个16位边界
for(u_int32 i=0; i < payloadlen % 2; i++)
{
*ptr = 0;
ptr ++;
chksumlen ++;
}
// 计算这个校验和,将结果填充到TCP头
pTcphdr->cksum = checksum((u_int16*) buff, chksumlen);
}
//////////////////////////////////////////////////////////////////////////
// 计算UDP检验和的函数
//////////////////////////////////////////////////////////////////////////
void ComputeUdpPseudoHeaderChecksum(IPHeader *pIphdr, UDPHeader *pUdphdr,
char *payload, int payloadlen)
{
u_int8 *buff = (u_int8 *) malloc(1024+payloadlen);
u_int8 *ptr=buff;
u_int32 chksumlen = 0;
u_int32 zero = 0;
// 伪头
// 包含源IP地址和目的IP地址
memcpy(ptr, &pIphdr->ipSource, sizeof(pIphdr->ipSource));
ptr += sizeof(pIphdr->ipSource);
chksumlen += sizeof(pIphdr->ipSource);
memcpy(ptr, &pIphdr->ipDestination, sizeof(pIphdr->ipDestination));
ptr += sizeof(pIphdr->ipDestination);
chksumlen += sizeof(pIphdr->ipDestination);
// 包含8位0域
memcpy(ptr, &zero, 1);
ptr += 1;
chksumlen += 1;
// 协议
memcpy(ptr, &pIphdr->ipProtocol, sizeof(pIphdr->ipProtocol));
ptr += sizeof(pIphdr->ipProtocol);
chksumlen += sizeof(pIphdr->ipProtocol);
// UDP长度
u_int16 udp_len = htons(sizeof(UDPHeader) + payloadlen);
memcpy(ptr, &udp_len, sizeof(udp_len));
ptr += sizeof(udp_len);
chksumlen += sizeof(udp_len);
// UDP头
memcpy(ptr, pUdphdr, sizeof(UDPHeader));
ptr += sizeof(UDPHeader);
chksumlen += sizeof(UDPHeader);
// 净荷
memcpy(ptr, payload, payloadlen);
ptr += payloadlen;
chksumlen += payloadlen;
// 补齐到下一个16位边界
for(int i=0; i < payloadlen % 2; i++)
{
*ptr = 0;
ptr ++;
chksumlen ++;
}
// 计算这个校验和,将结果填充到UDP头
pUdphdr->cksum = checksum((u_int16*) buff, chksumlen);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -