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);

解决方案 »

  1.   

    MS对xp sp2(或者其他版本,总之是从某个版本更新开始)以上版本开始进行ip头部检查,只要发送raw socket的源ip地址错误,就会出10049
    这应该是为了避免大量服务器被用作肉鸡syn flood攻击其他人-------------------------------------------------------
    广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711
      

  2.   

    检查setsockopt的参数哪个无效了?
      

  3.   

    我上面的程序还根本没有涉及到ip头内容啊
    我只是设置了让ip报包含ip头部而已
    如果不这样设置就不会出错..搞不懂
    而且这段代码在我软件以前的版本就不会出错,现在移植到新软件里面就出错了
    调试老程序时,发现是正常的..
    请大虾帮帮忙啊
      

  4.   

    我的bind前面的所有都是正确的,就是绑定不上。
    还有我曾经试着关掉防火墙,或者开通某端口,都无济于事。。
      

  5.   

    srv.sin_addr.s_addr = htonl(INADDR_ANY);MSDN文档说,socket(AF_INET,SOCK_RAW, IPPROTO_IP);时要绑定一个具体的地址,不能使用INADDR_ANY!
      

  6.   

    #include <WinSock2.h>
    #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);--------------------------------------
    没有问题,这是书中的标准例子,怎么可能会有问题?
      

  7.   

    #pragma comment( lib,"Ws2_32.lib")我忘记加了
    谢谢您的热心