怎样计算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));



...全文
101 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
nuaawenlin 2006-05-17
  • 打赏
  • 举报
回复
计算校验和的子函数逻辑没有错误,是不是你传进去的size有问题

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧