不加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
|