我在sdk下写一段代码,希望实现如果recv没有可接收的数据就返回,而不是
一直阻塞,双工可以解决这个问题吗?
能不能给点代码啊???

解决方案 »

  1.   

    char tmpbuf[10240];
    int recv_len=recv(skt,tmpbuf,sizeof(tmpbuf),MSG_PEEK);
      

  2.   

    用select模型是一种办法
    int nStatus;
    fd_set fdread;
    FD_ZERO(&fdread);
    FD_SET(m_hSocket, &fdread);
    TIMEVAL tv = {5, 0};
    nRet = select(0, &fdread, NULL, NULL, &tv);
    if( 0 == nRet )
    {
    //超时处理
    }
    if( FD_ISSET(m_hSocket, &fdread) )
    {
    //从套接字中读取数据
    }
      

  3.   

    while(TimeOut<Time)
    {
    if(Sock->IOCtl (FIONREAD,&datasize))
    {
    if(datasize!=0)
    return true;
    Sleep(100);
    TimeOut+=100;
    }
    else
    {
    DWORD EE=GetLastError();
    }
    };
      

  4.   

    明白否,利用Sock->IOCtl (FIONREAD,&datasize)就可以立即得出当前可读的字节数,
    当不为0时就RECV它。否则跳过。 给分吧, 如果还有其他问题请问。
      

  5.   

    没错,winsock的确有阻塞和非阻塞两种工作方式。
    给分吧。
      

  6.   

    不好意思,网断了
    林的方法我想问问,Sock是个什么对象的指针?加油的方法我试了,但是还是阻塞住的,why
      

  7.   

    我刚做的一个也有此问题,我是这样做的,分开取数和接收.
    在Receive事件中置完成标记,这样阻塞对程序没有影响.
    在另外的函数中完成取数.lngStartTime=GetTickCount();
    lngPassTime=0;while(lngPassTime < 2000)
    {
        if (g_bCarInfoReady)  // g_bCarInfoReady 表示状态标记
        {
             完成取数操作;
             return 1;
        }
        Sleep(10);
        lngPassTime = GetTickCount()-lngStartTime;
    }return -3;  // 3秒超时以上代码正在使用,经过实践检测,绝对是可用.如果有更好的方法,请指教.
      

  8.   

    use setsockopt() to set the timeout during receiving
      

  9.   

    select就行了,以前的帖子很多,建议申请FAQ。