阅读:2796回复:7
passthru下TCP校验和的计算问题 郁闷好几天了
写了一个数据包捕获转发的驱动 计算TCP校验一直不正确 IP校验和没问题 算TCP校验和的时候我已经增加了伪头啊...
源码如下 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; } 封装TCP包部分 //计算TCP包 nTempPort=TcpHdr.sourcePort; TcpHdr.sourcePort=TcpHdr.destinationPort; TcpHdr.destinationPort=nTempPort; nTempSeq=TcpHdr.sequenceNumber; TcpHdr.sequenceNumber=TcpHdr.acknowledgeNumber;//上次的ACK值作为SEQ TcpHdr.acknowledgeNumber=nTempSeq+htons((nDataLen-sizeof(ETHeader)-sizeof(IPHeader)));//计算ACK内容 TcpHdr.dataoffset=(sizeof(TCPHeader)/4<<4|0); TcpHdr.flags=0x18; TcpHdr.windows=65535; TcpHdr.checksum=0; //填充TCP伪头 PsdHdr.saddr = IpHdr.ipSource; PsdHdr.daddr = IpHdr.ipDestination; PsdHdr.mbz = 0; PsdHdr.ptcl = IPPROTO_TCP; PsdHdr.tcpl = ntohs(sizeof(TCPHeader)); RtlZeroMemory(szSendData,2048);//清零 RtlCopyMemory(szSendData,&PsdHdr,sizeof(PSDHeader)); RtlCopyMemory(szSendData+sizeof(PSDHeader),&TcpHdr,sizeof(TCPHeader)); TempCheckNum=checksum((USHORT*)szSendData,sizeof(PSDHeader)+sizeof(TCPHeader)); //计算TCP校验和 TcpHdr.checksum=TempCheckNum; |
|
沙发#
发布于:2010-12-30 01:01
补充一句 客户端网卡已经收到包了 只不过因为校验和不对被上层丢弃了
|
|
板凳#
发布于:2010-12-30 11:15
没用 我已经加了伪头了
|
|
地板#
发布于:2010-12-30 18:52
自己解决了 因为不在TCP握手阶段 校验和要校验数据包大小 感谢两位好心的朋友帮忙 困扰了好几天了也
|
|