本帖最后由 xieming43713337 于 2011-09-05 15:31:41 编辑

解决方案 »

  1.   


    //设置非阻塞方式连接
    unsigned long ul = 0;
    int ret = ioctlsocket(m_sck, FIONBIO, (unsigned long*)&ul);
    if(ret==SOCKET_ERROR){return 0;}

    int iResult = ::connect(m_sck,(sockaddr*)&m_netaddr,sizeof(m_netaddr));

    //select 模型,即设置超时
    fd_set r;
    FD_ZERO(&r);
    FD_SET(m_sck, &r);

    struct timeval timeout ;
    timeout.tv_sec = 1; //连接超时1秒
    timeout.tv_usec =0;

    ret = select(0, 0, &r, 0, &timeout);
    if ( ret <= 0 )
    {
    ::closesocket(m_sck);
    return false;
    }

    //再设回阻塞模式
    unsigned long ul1= 0 ;
    ret = ioctlsocket(m_sck, FIONBIO, (unsigned long*)&ul1);
    if(ret==SOCKET_ERROR)
    {
    ::closesocket (m_sck);
    return false;
    }
      

  2.   

    //设置非阻塞方式连接
        unsigned long ul = 0;
        int ret = ioctlsocket(m_sck, FIONBIO, (unsigned long*)&ul);这个因为ul=0;其实是阻塞
    FIONBIO 
    Use with a nonzero argp parameter to enable the nonblocking mode of socket s. The argp parameter is zero if nonblocking is to be disabled.
      

  3.   

    和这个类似
    http://topic.csdn.net/u/20110902/11/ADA2AC00-0BC4-461F-8417-4026435CE577.html#r_75330540