读书人

tcp校验和的有关问题困扰小弟我好久

发布时间: 2012-02-25 10:01:49 作者: rapoo

tcp校验和的问题,困扰我好久了,代码和说明如下:

具体代码和一些说明如下: TcppsdHeader.sourceip=ipr.sourceip;
TcppsdHeader.destip=ipr.destip;
TcppsdHeader.fillzero=0;
TcppsdHeader.protocol=IPPROTO_TCP;//协议类型
TcppsdHeader.tcplen=htons(hdr-> bh_datalen-14-20);
memset(temp,0,sizeof(temp));
memcpy(temp,&TcppsdHeader,sizeof(TcppsdHeader));


memcpy(temp+sizeof(TcppsdHeader),tcpr,hdr-> bh_datalen-14-20);
tcpr-> tcp_checksum=checksum((USHORT *)temp,sizeof(TcppsdHeader)+hdr-> bh_datalen-14-20);

其中tcppsdheader定义如下:
typedef struct tcppsdheader
{
unsigned int sourceip;
unsigned int destip;
char fillzero;
char protocol;
unsigned short tcplen;
}tcppsdheader,*ptcppsdheader;


校验和算法如下:

unsigned short checksum(USHORT *buffer,int size)
{
unsigned long cksum=0;
while(size> 1)
{
cksum+=*buffer++;


size-=sizeof(unsigned short);
}
if(size)
cksum+=*buffer;
cksum=(cksum> > 16)+(cksum & 0xffff);
cksum+=(cksum> > 16);
return (unsigned short)(~cksum);
}

hdr-> bh_datalen为整个数据包的长度,用它减去以太桢头的长度14,再减去ip头的长度20就是tcp头部和它的数据长度了。
ipr为该包的ip头。
tcpr为指向缓冲区一个tcp包的指针。修改了此包的内容,然后再将校验和重新计算之后,再将此数据包发送出去,但是嗅探包后发现校验和计算不正确,希望大家帮我看看,想想办法。

[解决办法]
把cksum+=*buffer++; 改为cksum+=(BYTE)*buffer++;

读书人网 >VC/MFC

热点推荐