我用socket的函数sendto和recvfrom函数发送和接收数据,现在的问题是发送出去的icmp包是要求远程主机(肯定能ping通)返回应答包的,但是却没有返回应答包,我用select函数判断socket状态,一直是不可读的,请问这可能是什么原因?

解决方案 »

  1.   

    是这样初始化的:         
             WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2,1),&wsaData) != 0)
    {
    fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());
    exit(1);
    }
    具体代码看看这个:
    http://community.csdn.net/Expert/topic/5771/5771091.xml?temp=.1828272
      

  2.   

    还有这样:sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,0);
      

  3.   

    不会吧,那我给你拷过来,麻烦大侠看下:
    代码如下:
             int iSendLen=sizeof(IcmpHeader)+PACKET_SIZE;
    char * pSendBuf=new char[iSendLen];
    struct sockaddr_in socDest;
             strIP="192.168.10.122";         socket sockRaw;
    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2,1),&wsaData) != 0)
    {
    fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());
    exit(1);
    } sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,0);
    if(INVALID_SOCKET==sockRaw)
    {
    printf("invalid socket!\n");
    exit(1);
    } FillIcmpPackets((IcmpHeader*)pSendBuf,iSendLen); socDest.sin_addr.s_addr=inet_addr(strIP);
    socDest.sin_family=AF_INET; int iSendNum;
    if(SOCKET_ERROR==(iSendNum = sendto(sockRaw,pSendBuf,iSendLen,0, \
    (sockaddr *)&socDest,sizeof(socDest))))
    {
    printf("sendto failed!\n");
    closesocket(sockRaw);
    exit(1);
    }
    printf("have sent to %s  %d packets!\n",(char *)strIP,iSendNum);

    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(sockRaw,&fds);
    timeval iTimeval={1,0};
    int iResult=select(NULL,&fds,0,0,&iTimeval);上面这段代码就是用sendto发送一个包,然后用select判断socket是否是可读的,进一步再接收。上面192.168.10.122肯定是可以ping通的但是select老是返回0,这是什么原因?