很奇怪,本来好好的还能接到数据,但我在舒适化里多加了个SOCKET后原来那个就不阻塞了,我加了
while(SOCKET_ERROR==recvfrom(sockClient_R,recvBuf,1440,0,(SOCKADDR*)&addrSrv_S,&len))
    { 
     }
却也怎么也接受不到数据了,一直不阻塞,怪了!很疑惑,用多个SOCKET端口的话,不加select或其他I/O模型不行吗?I/O模型只是防止阻塞函数在条件为满足的时候阻塞而是程序挂起。

解决方案 »

  1.   

    while(SOCKET_ERROR==recvfrom(sockClient_R,recvBuf,1440,0,(SOCKADDR*)&addrSrv_S,&len))
      {  
      }服务地址只有一个,单线程的话,你这里仅仅是在等待一个端口的数据而已啊。
      

  2.   

    我用的是双线程,每个线程里负责一个端口。这个地方用while是因为recvfrom不阻塞了,我发送端没发这边就返回了,所以才在这加了循环
      

  3.   

    如果sendto目标地址不存在,那么recvfrom会收到一个错误信息,如果要想屏蔽这种错误可以用下面的代码:
    // UINT IOC_IN = 0x80000000;
    // UINT IOC_VENDOR = 0x18000000;
    UINT nConnReset = IOC_IN | IOC_VENDOR | 12;
    BOOL bNewBehavior = FALSE;
    DWORD dwBytesReturned = 0;
    return SOCKET_ERROR != ::WSAIoctl(nSock,nConnReset,&bNewBehavior,sizeof(bNewBehavior),NULL,0,&dwBytesReturned, NULL, NULL);
    试试看吧。
      

  4.   

    本帖最后由 VisualEleven 于 2011-06-07 17:09:50 编辑
      

  5.   

    如果接受区中还有数据recefrom就会收到数据然后返回
      

  6.   

    recvfrom是没有接到数据的,返回值是-1,但它返回了!
      

  7.   

    你的是UDP,搞错啦我怎么觉得你的while应该这么写while(SOCKET_ERROR!=recvfrom(sockClient_R,recvBuf,1440,0,(SOCKADDR*)&addrSrv_S,&len))
      {  
      }
      

  8.   

    int Socket::Socket_send()
    {
        len=sizeof(SOCKADDR);
        return(sendto(sockSrv_S,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient_R,len));
        
    }void Socket::Socket_reveive()
    {
        
        len=sizeof(SOCKADDR);
        recvfrom(sockSrv_R,recvBuf,1500,0,(SOCKADDR*)&addrClient_S,&len);
    }
    --------------
    ???
      

  9.   

    有用WSAGetLastError()看看是什么错误吗?
      

  10.   

    sockSrv_S=socket(AF_INET,SOCK_DGRAM,0);
        addrClient_R.sin_addr.S_un.S_addr=inet_addr("192.168.1.227");
        addrClient_R.sin_family=AF_INET;
        addrClient_R.sin_port=htons(3000);
        sendto(sockSrv_S, "Test", 5, 0, (struct sockaddr*)&addrClient_R, &len);
    这个好像不麻烦   你在启动recvfrom之前    设置好IP信息后  用sendto 随便发送一些东西出去   UDP协议就是这样   可能需要预先建立一条UDP内核记录吧  
      

  11.   

    回12楼,我用了两个套接字,一个负责发,一个负责收;
    回14楼,UDP不是接受端需要先运行吗?接受端需要先绑定本地的端口号,发送端才能发!
      

  12.   

    纠结啊,最开始还好着呢!怎么突然就不行了呢!
    GetLastError()的返回值是10022,怎么回事呢?
      

  13.   


    to:hmm7e如果recvfrom绑定的端口和sendto发送的端口不是同一个端口,sendto的目标地址不存在recvfrom还是收到一个错误消息吗?
    之所以这么问,是因为有次在自己的程序中每按一个按钮sendto一次,recvfrom就会莫名的返回一个SOCKET_ERROR,一直不明白这是怎么回事!
    你说的“错误信息”应该是不是函数返回错误,而是收到一个类似于“目标不可到达”的数据包吧?
      

  14.   

    我当时用的同一个socket发送和接收,如果发送的“目标地址不存在”,那么就会收到一个错误,所以有此一说,没试过你这两个socket的情况。你也可以用一个socket试试,如果两情况都一样的话,你可以修改后试试。
      

  15.   

    大家帮我看看是不是接收端和发送端一端建立两个套接字,系统就会错啊!我前几天改成一个套接字也不行,刚才就可以了,现在又改成两个了也没问题,recvfrom正常阻塞,很晕!怎么有时候好,有时候不好呢?是开发环境的问题还是怎么了?
      

  16.   

    问题解决了,bind的位置不识别。看来wince和win32编程之间还是有差别的!
      

  17.   

    bind的位置应该是在哪啊?我也遇到一样的问题