怎样计算tcp头中的校验和?
yyy6 2006-05-17 04:06:53 我收到一个tcp包后, 改变了包中的目的地址( 目的mac不变), 并重新计算校验和.把改包发出.
结果用测试软件看到该包的校验和不对.
怎样计算tcp头中的校验和?
//CheckSum:计算校验和的子函数
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
过程:
lpIphdr->m_dIP = inet_addr("192.168.0.31"); //改 ip
lpIphdr->m_cksum = 0;
TCP_HEADER * pTcpHeader;
int ip_header_len = (lpIphdr->m_ver_hlen)&0x0f;
ip_header_len = ip_header_len*4;
pTcpHeader = (TCP_HEADER *)(lpIphdr + ip_header_len);
pTcpHeader->sum = 0;
PSDHEADER psdHeader; //伪tcp首部
psdHeader.saddr=lpIphdr->m_sIP;
psdHeader.daddr=lpIphdr->m_dIP;
psdHeader.mbz=0;
psdHeader.ptcl=6; //tcp
psdHeader.tcpl=htons(sizeof(TCP_HEADER));
memcpy(sendBuf, &psdHeader, sizeof(PSDHEADER));
memcpy(sendBuf+sizeof(PSDHEADER), pTcpHeader, sizeof(TCP_HEADER));
pTcpHeader->sum=checksum((USHORT *)sendBuf,sizeof(PSDHEADER)+sizeof(TCP_HEADER));