首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-02-25 
tcp校验和的问题,困扰我好久了,代码和说明如下: 具体代码和一些说明如下:TcppsdHeader.sourceipipr.sourc

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++;

热点排行