afxsock.h和winsock2.h运行时产生冲突如何解决

afxsock.h和winsock2.h运行时产生冲突如何解决!

网友提问于2006年12月26日

 
不加afxsock.h时运行没有错误。但是我的另一个程序即用到了axfsock.h又用到了winsock2.h.所以急需解决这两个头文件冲突的问题。我把winsock2.h放在了afxsock.h的前面。避免了编译时冲突。但运行时却产生了错误。望各位大虾不吝赐教!小弟先行谢谢了!
代码如下:
stdafx.h:
......
#include // MFC core and standard components
#include // MFC extensions
#include // MFC Automation classes
#include // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
#include //此处为加入的winsock2和afxsock头文件。如不加afxsock则
//不报错!
#include // MFC socket extensions
......

发送函数代码如下:
.......

void MessageSend()
{
WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN addr_in;
IPHEADER ipHeader;
TCPHEADER tcpHeader;
PSDHEADER psdHeader;
int SourcePort;
char szSendBuf[60]={0};
CString str;
BOOL flag;
int nTimeOver;
int sleeptime;
sleeptime=300;
if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
str.Format("%d",WSAGetLastError());
AfxMessageBox(str);
}
sock=NULL;
if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET)
{
str.Format("%d",WSAGetLastError());
AfxMessageBox(str);
}
flag=true;
if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR)
{
str.Format("%d",WSAGetLastError());
AfxMessageBox(str);
}
nTimeOver=1000;
if(setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&nTimeOver,sizeof(nTimeOver))==SOCKET_ERROR) //设置发送的时间
{
str.Format("%d",WSAGetLastError());
AfxMessageBox(str);
}
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(5665);
addr_in.sin_addr.S_un.S_addr=inet_addr("192.168.0.49");
for(int f=0;f<1;f++)
{
//填充IP首部
ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
ipHeader.tos=0;
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader)); //IP总长度
ipHeader.ident=1;
ipHeader.frag_and_flags=0; //无分片
ipHeader.ttl=(unsigned char)GetTickCount()%87+123;
ipHeader.proto=IPPROTO_TCP; // 协议类型为 TCP
ipHeader.checksum=0; //效验位先初始为0
//ipHeader.sourceIP=htonl(GetTickCount()*474695); //随机产生一个伪造的IP
ipHeader.sourceIP=inet_addr("192.168.0.24");
ipHeader.destIP=inet_addr("192.168.0.49"); //目标IP
//填充TCP首部
SourcePort=GetTickCount()*43557%9898; //随机产生一个端口号
tcpHeader.th_dport=htons(5665); //发送的目的端口
tcpHeader.th_sport=htons(SourcePort); //源端口号
tcpHeader.th_seq=htonl(0x12345678); //序列号
tcpHeader.th_ack=0; //确认号
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag=2; //为SYN请求
tcpHeader.th_win=htons(512);
tcpHeader.th_urp=0;
tcpHeader.th_sum=0;
//填充TCP伪首部用来计算TCP头部的效验和
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));
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));
//把伪造好的IP头 和 TCP 头 放进 buf 准备发送
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
//memcpy(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), "lover!", 6);
//发送数据包
//rect=sendto(sock,szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader)+6, 0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if(connect(sock,(struct sockaddr*)&addr_in, sizeof(addr_in))==SOCKET_ERROR)
{
str.Format("%d",WSAGetLastError());
AfxMessageBox(str);
}
//rect=sendto(sock,szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader)+6, 0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if(send(sock,szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader), 0)==SOCKET_ERROR)
{
str.Format("%d",WSAGetLastError());
AfxMessageBox(str);
}
Sleep(sleeptime); //根据自己网速的快慢确定此值,sleeptime越小发得越快
}//endwhile //重新伪造IP的源地址等再次向目标发送
closesocket(sock);
WSACleanup();
}


当connect时出现错误10049:来自本地机器的不可用地址。但是不用afxsock.h时并不抱错!我想应该是winsock2和afxsock头文件冲突的问题

问题搞定了!
#include
#pragma comment(lib,"Ws2_32.lib")
#include

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值