我在写socketraw程序时,遇到了一个问题,就是tcp包头部的校验和老是出错,我用的是书上的那个checksum函数,我的代码简单的就是下面的,我把HttpBuf这个里面的作为tcp的data,然后计算校验和,可是就是不对,而不要这个HttpBuf的时候,倒是计算没有问题,到底是怎样的问题呢?char HttpBuf[]="\r\n<html>\r\nfsafsaf\r\n</html>\r\n";//填充IP首部
ipHeader.h_lenver=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
// ipHeader.tos=0;
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=1;
ipHeader.frag_and_flags=0;
ipHeader.ttl=128;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.sourceIP=inet_addr("218.57.142.211");
ipHeader.destIP=inet_addr("218.57.137.84"); //填充TCP首部
tcpHeader.th_dport=htons(80);
tcpHeader.th_sport=htons(1234); //源端口号
tcpHeader.th_seq=htonl(0x12345678);
tcpHeader.th_ack=htonl(0x11111111);
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag=24;
tcpHeader.th_win=htons(512);
tcpHeader.th_urp=0;
tcpHeader.th_sum=0; psdHeader.saddr=ipHeader.sourceIP;
psdHeader.daddr=ipHeader.destIP;
psdHeader.mbz=0;
psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader)); //计算校验和
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
memcpy(szSendBuf+sizeof(psdHeader)+sizeof(tcpHeader), HttpBuf, sizeof(HttpBuf));
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader)); memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader)); memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); memcpy(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader),HttpBuf,100); rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader)+sizeof(HttpBuf),0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if (rect==SOCKET_ERROR)
{
printf("send error!:%d\n",WSAGetLastError());
return false;
}
else
printf("send ok!\n");
ipHeader.h_lenver=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
// ipHeader.tos=0;
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=1;
ipHeader.frag_and_flags=0;
ipHeader.ttl=128;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.sourceIP=inet_addr("218.57.142.211");
ipHeader.destIP=inet_addr("218.57.137.84"); //填充TCP首部
tcpHeader.th_dport=htons(80);
tcpHeader.th_sport=htons(1234); //源端口号
tcpHeader.th_seq=htonl(0x12345678);
tcpHeader.th_ack=htonl(0x11111111);
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag=24;
tcpHeader.th_win=htons(512);
tcpHeader.th_urp=0;
tcpHeader.th_sum=0; psdHeader.saddr=ipHeader.sourceIP;
psdHeader.daddr=ipHeader.destIP;
psdHeader.mbz=0;
psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader)); //计算校验和
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
memcpy(szSendBuf+sizeof(psdHeader)+sizeof(tcpHeader), HttpBuf, sizeof(HttpBuf));
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader)); memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader)); memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); memcpy(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader),HttpBuf,100); rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader)+sizeof(HttpBuf),0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if (rect==SOCKET_ERROR)
{
printf("send error!:%d\n",WSAGetLastError());
return false;
}
else
printf("send ok!\n");
解决方案 »
- MFC中向导对话框中怎样隐藏“帮助”按钮
- 内存映射 按打开按扭时可以读数,但一改变qwFileOffset就读不出来了
- 如何在CMFCCaptionBar添加多个按钮?
- 使用API异步串口通信 为什么每次都只能收到8个字节
- 其实不用上班,呆在CSDN非常好,其实在家自己学习非常好,可是我们没有资本
- Listbox 使用
- 急!急!一个关于TCP模式的socket在recv时的问题
- 请教一个关于CString* 指针内存释放的问题!谢谢!
- 在单文档视图中加入对话框后的问题
- c++ mfc settimer
- 用MFC自己写出来的框架,为什么在改变大小时,工具条总是闪,是不是有什么属性要设置
- 关于 图形处理/算法 板块 发贴、结贴、FAQ提交的一些建议
其实这里是我错了,现在我把sizeof(HttpBuf)加上了,
可是还是提示数据校验和错误呢,
到底怎么回事呢。