请高手帮看一下,计算tcp校验和是否正确。用科来查看时总提示tcp校验和错误。 int l = libnet_init_packet( (LIBNET_TCP_H+nDataLen), &pBuffer);
if(-1 == l)
{
AfxMessageBox("init packet error.");
return l;
}
l = libnet_build_tcp((u_short)nSrcPort, (u_short)nDstPort, dwSeqguess, dwAckId,
conByte, dwWinSize, 0, pData, nDataLen, pBuffer);
l = libnet_do_checksum( pBuffer, IPPROTO_TCP, LIBNET_TCP_H);
if (l != 1)
{
AfxMessageBox("tcpÍ·µÄУÑéºÍ²»ÕýÈ·¡£");
return -1;
}
PPACKETTCP pTcp = (PPACKETTCP)pBuffer;
//重新计算tcp校验和
ip_hdr Ipheader;
tcp_hdr Tcpheader;
ps_hdr psheader;
char buf[2000]; Tcpheader.sport=nSrcPort;
Tcpheader.dport=nDstPort;
Tcpheader.DataOffset=(5) << 4;
Tcpheader.Flags=TH_ACK;//ACK+PSH;
Tcpheader.Checksum=0;
Tcpheader.UrgPointer=0; Tcpheader.Windows=dwWinSize;
Tcpheader.acknum=dwAckId;
Tcpheader.seqnum=dwSeqguess; PS_HDR pseudo_header;
pseudo_header.source_address =dwSrcIP;
pseudo_header.dest_address =dwDstIP;
pseudo_header.placeholder = 0;
pseudo_header.protocol = IPPROTO_TCP;
pseudo_header.tcp_length = htons(20); ZeroMemory(buf, sizeof(buf));
memcpy(buf,&pseudo_header,sizeof(pseudo_header));
char *ptr=NULL;
ptr=buf+sizeof(pseudo_header);
memcpy(ptr,&Tcpheader,20);
ptr+=20;
const char* pbuf = (const char*)(pTcp+sizeof(PACKETTCP));
int nDataLen2 = 0;
nDataLen2 = strlen(pbuf);
memcpy(ptr, pbuf, nDataLen2);
//计算tcp校验和
pTcp->th_sum = 0;
pTcp->th_sum = checksum((unsigned short*)buf, (sizeof(pseudo_header)+20+nDataLen2) );
前面调用的函数的实现
unsigned short checksum(unsigned short *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 (unsigned short)(~cksum);
}
if(-1 == l)
{
AfxMessageBox("init packet error.");
return l;
}
l = libnet_build_tcp((u_short)nSrcPort, (u_short)nDstPort, dwSeqguess, dwAckId,
conByte, dwWinSize, 0, pData, nDataLen, pBuffer);
l = libnet_do_checksum( pBuffer, IPPROTO_TCP, LIBNET_TCP_H);
if (l != 1)
{
AfxMessageBox("tcpÍ·µÄУÑéºÍ²»ÕýÈ·¡£");
return -1;
}
PPACKETTCP pTcp = (PPACKETTCP)pBuffer;
//重新计算tcp校验和
ip_hdr Ipheader;
tcp_hdr Tcpheader;
ps_hdr psheader;
char buf[2000]; Tcpheader.sport=nSrcPort;
Tcpheader.dport=nDstPort;
Tcpheader.DataOffset=(5) << 4;
Tcpheader.Flags=TH_ACK;//ACK+PSH;
Tcpheader.Checksum=0;
Tcpheader.UrgPointer=0; Tcpheader.Windows=dwWinSize;
Tcpheader.acknum=dwAckId;
Tcpheader.seqnum=dwSeqguess; PS_HDR pseudo_header;
pseudo_header.source_address =dwSrcIP;
pseudo_header.dest_address =dwDstIP;
pseudo_header.placeholder = 0;
pseudo_header.protocol = IPPROTO_TCP;
pseudo_header.tcp_length = htons(20); ZeroMemory(buf, sizeof(buf));
memcpy(buf,&pseudo_header,sizeof(pseudo_header));
char *ptr=NULL;
ptr=buf+sizeof(pseudo_header);
memcpy(ptr,&Tcpheader,20);
ptr+=20;
const char* pbuf = (const char*)(pTcp+sizeof(PACKETTCP));
int nDataLen2 = 0;
nDataLen2 = strlen(pbuf);
memcpy(ptr, pbuf, nDataLen2);
//计算tcp校验和
pTcp->th_sum = 0;
pTcp->th_sum = checksum((unsigned short*)buf, (sizeof(pseudo_header)+20+nDataLen2) );
前面调用的函数的实现
unsigned short checksum(unsigned short *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 (unsigned short)(~cksum);
}
解决方案 »
- 如何截取字符串,并存到数组中!!!
- 对WM_CHAR消息产生的一些疑问。请大家围观一下。谢啦。。。
- 关于 so_reuseaddr 和Time_wai的疑问
- 请教一个错误,有关tab control的头文件错误
- 如何一起执行多条SQL语句??
- 想学习一下p2p开发,但是苦于找不到入门的路,在网上转了好几天了,还是一头的雾水,请高手指点一下入门
- 求教:AddNew以后Update的问题
- CFileDialog的问题? 我如何知道用户点击 了确定还是取消
- vc控制扫描仪,进行图片扫描!有没有相关的例子?
- 试问:MFC这个DLL到底在操作系统自带还是VC带的? 请作必要解释说明,谢谢!!!
- 我正在做抓包程序,修改了包的长度后如何计算tcp头的校验和??
- 一个文件流错误
tcpip详解第2卷我看了一下目录,好像没有和计算tcp校验和有关的内容。
注意tcp_output不直接调用它,是connect函数最终导致它被调用,见808页的下面。然后tcp_output里面调用了in_cksum计算校验和。其实我也没做过,希望能够帮助你。
tcp_output里面调用了in_cksum计算校验和,在第702页的下面