WSADATA WSAData; SOCKET sndSock;
SOCKET rcvSock; if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
AfxMessageBox("Windows 通信端口初始化失败.");
} /*create sending sockets*/
//if( (sndSock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET )
if( (sndSock = socket(AF_INET, SOCK_RAW, 0)) == INVALID_SOCKET )
{
AfxMessageBox("创建发送原始套接字失败!");
} BOOL flag = TRUE;
if( setsockopt(sndSock, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR ) //2=IP_HDRINCL
{
AfxMessageBox("setsockopt IP_HDRINCL error!");
} /*sniff socket*/
//if( (rcvSock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET )
if( (rcvSock = socket(AF_INET, SOCK_RAW, 0)) == INVALID_SOCKET )
{
AfxMessageBox("创建接收原始套接字失败!");
}
//下面的代码不要就不会出错,可是我必须要,请问为什么??
//谢谢!
if( setsockopt(rcvSock,IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR ) //2=IP_HDRINCL
{
AfxMessageBox("setsockopt IP_HDRINCL error!");
} sockaddr_in srv;
srv.sin_family = AF_INET;
srv.sin_port = htons(1234);
srv.sin_addr.s_addr = htonl(INADDR_ANY); if( bind(rcvSock, (LPSOCKADDR)&srv, sizeof(srv)) == SOCKET_ERROR )
{
CString str;
str.Format("socket() failed! %d",WSAGetLastError());
AfxMessageBox("bind() failed " + str); }
DWORD dwValue = 1;
ioctlsocket(rcvSock, SIO_RCVALL, &dwValue);
SOCKET rcvSock; if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
AfxMessageBox("Windows 通信端口初始化失败.");
} /*create sending sockets*/
//if( (sndSock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET )
if( (sndSock = socket(AF_INET, SOCK_RAW, 0)) == INVALID_SOCKET )
{
AfxMessageBox("创建发送原始套接字失败!");
} BOOL flag = TRUE;
if( setsockopt(sndSock, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR ) //2=IP_HDRINCL
{
AfxMessageBox("setsockopt IP_HDRINCL error!");
} /*sniff socket*/
//if( (rcvSock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET )
if( (rcvSock = socket(AF_INET, SOCK_RAW, 0)) == INVALID_SOCKET )
{
AfxMessageBox("创建接收原始套接字失败!");
}
//下面的代码不要就不会出错,可是我必须要,请问为什么??
//谢谢!
if( setsockopt(rcvSock,IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR ) //2=IP_HDRINCL
{
AfxMessageBox("setsockopt IP_HDRINCL error!");
} sockaddr_in srv;
srv.sin_family = AF_INET;
srv.sin_port = htons(1234);
srv.sin_addr.s_addr = htonl(INADDR_ANY); if( bind(rcvSock, (LPSOCKADDR)&srv, sizeof(srv)) == SOCKET_ERROR )
{
CString str;
str.Format("socket() failed! %d",WSAGetLastError());
AfxMessageBox("bind() failed " + str); }
DWORD dwValue = 1;
ioctlsocket(rcvSock, SIO_RCVALL, &dwValue);
这应该是为了避免大量服务器被用作肉鸡syn flood攻击其他人-------------------------------------------------------
广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711
我只是设置了让ip报包含ip头部而已
如果不这样设置就不会出错..搞不懂
而且这段代码在我软件以前的版本就不会出错,现在移植到新软件里面就出错了
调试老程序时,发现是正常的..
请大虾帮帮忙啊
还有我曾经试着关掉防火墙,或者开通某端口,都无济于事。。
#include <ws2tcpip.h>
#include <MSTcpIP.h>
#pragma comment( lib,"Ws2_32.lib")
WSADATA WSAData; SOCKET sndSock;
SOCKET rcvSock; if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
} /*create sending sockets*/
//if( (sndSock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET )
if( (rcvSock = socket(AF_INET, SOCK_RAW, 0)) == INVALID_SOCKET )
{
} BOOL flag = TRUE;
if( setsockopt(rcvSock, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR ) //2=IP_HDRINCL
{
DWORD dw = WSAGetLastError();
return -1;
} sockaddr_in srv;
srv.sin_family = AF_INET;
srv.sin_port = htons(1234);
srv.sin_addr.s_addr = htonl(INADDR_ANY); if( bind(rcvSock, (LPSOCKADDR)&srv, sizeof(srv)) == SOCKET_ERROR )
{
DWORD dw = WSAGetLastError();
return -1;
}
DWORD dwValue = 1;
ioctlsocket(rcvSock, SIO_RCVALL, &dwValue);--------------------------------------
没有问题,这是书中的标准例子,怎么可能会有问题?
谢谢您的热心