建立一个网络层的raw socket ,接收数据,首先将它绑定在本机上,结果发现总是报错“bind error :10038”,不知何解,望各位赐教,谢谢建立和绑定socket的代码如下:
rs = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);/*在网络层使用的原始套接字*/
if(rs==INVALID_SOCKET)
{
printf("...........create error:%d\n",GetLastError());
return -1;
}
struct sockaddr_in dst;dst.sin_family=AF_INET;
dst.sin_port=htons(8888);
dst.sin_addr.S_un.S_addr=htonl(INADDR_ANY);if(0 != bind(us,(struct sockaddr*)&dst,sizeof(struct sockaddr)))
{
printf("bind error: %d\n",GetLastError());
return -1;
}setsockopt(rs,IPPROTO_IP,IP_HDRINCL,(char *)&b,sizeof(BOOL));DWORD lpvBuffer = 1; 
DWORD lpcbBytesReturned = 0 ; 
WSAIoctl(rs,SIO_RCVALL,&lpvBuffer,sizeof(lpvBuffer),NULL,0,&lpcbBytesReturned,NULL,NULL);nLen = recvfrom(rs,buf,1024,0,addr,&nAddrLen);

解决方案 »

  1.   


    // 创建原始套节字
    SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_IP); // 获取本地IP地址
    char szHostName[56];
    SOCKADDR_IN addr_in;
    struct  hostent *pHost;
    gethostname(szHostName, 56);
    if((pHost = gethostbyname((char*)szHostName)) == NULL)
    return ; // 在调用ioctl之前,套节字必须绑定
    addr_in.sin_family  = AF_INET;
    addr_in.sin_port    = htons(0);
    memcpy(&addr_in.sin_addr.S_un.S_addr, pHost->h_addr_list[0], pHost->h_length); printf(" Binding to interface : %s \n", ::inet_ntoa(addr_in.sin_addr));
    if(bind(sRaw, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)
    return; // 设置SIO_RCVALL控制代码,以便接收所有的IP包
    DWORD dwValue = 1;
    if(ioctlsocket(sRaw, SIO_RCVALL, &dwValue) != 0)
    return ;

    // 开始接收封包
    char buff[1024];
    int nRet;
    while(TRUE)
    {
    nRet = recv(sRaw, buff, 1024, 0);
    if(nRet > 0)
    {
    DecodeIPPacket(buff);
    }
    }
    closesocket(sRaw);
      

  2.   

    据说装了sp之后不支持raw socket了。
      

  3.   

    不会吧,那现在用什么高协议分析的,wincap?
      

  4.   

    哈哈,一个小失误,吧socket的名字写错了
    if(0 != bind(us,(struct sockaddr*)&dst,sizeof(struct sockaddr)))-----> if(0 != bind(rs,(struct sockaddr*)&dst,sizeof(struct sockaddr)))
    多谢诸位....