//--连接网站主机设置为非阻塞模式 unsigned  long  ul = 1;   
int  ret = ioctlsocket(comm_socket,FIONBIO,(unsigned   long*)&ul);   
if(ret==SOCKET_ERROR)  
{
DWORD r = WSAGetLastError();
closesocket(comm_socket);  
WSACleanup();
return  FALSE;
}
int rrr = 1 ;
while (rrr)
{
int rct ;
rct = connect(comm_socket, (sockaddr*)&comm_addr, len); rrr  = WSAGetLastError(); if ( rct == SOCKET_ERROR)
{
struct timeval timeout ; 
fd_set r;  FD_ZERO(&r); 
FD_SET(comm_socket, &r); 
timeout.tv_sec  = 30;             //--设定超时为30秒
timeout.tv_usec =0; 
ret = select(0, 0, &r, 0, &timeout); 
if ( ret <= 0 )

::closesocket(comm_socket); 
WSACleanup();
return FALSE; 
}
}
}
这样做为什么不对了 谁能指点一下吗

解决方案 »

  1.   

    sockaddr_in sTestPoint;
    SOCKET sock; //初使化服务器地址
    sTestPoint.sin_family=AF_INET;
    sTestPoint.sin_port=htons(nPort);
    sTestPoint.sin_addr.S_un.S_addr=inet_addr(pszIP); sock= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //设置发送超时
    if(::setsockopt(sock
    , SOL_SOCKET
    , SO_SNDTIMEO, 
    (char *)&m_nTimeOut,
    sizeof(m_nTimeOut)) == SOCKET_ERROR)
    {
    char pLog[100];
    sprintf((char*)pLog, "设置[%s]发送超时失败", pszIP);
    return false;
    }

    //设置接收超时
    if(::setsockopt(sock
    ,SOL_SOCKET
    ,SO_RCVTIMEO,
    (char *)&m_nTimeOut,
    sizeof(m_nTimeOut))==SOCKET_ERROR)
    {
    char pLog[100];
    sprintf((char*)pLog, "设置[%s]接收超时失败", pszIP);
    return false;
    }

    //设置非阻塞方式连接
    unsigned long ul = 1;
    int nRet = ioctlsocket(sock, FIONBIO, (unsigned long*)&ul);
    if(nRet == SOCKET_ERROR)
    {
    char pLog[100];
    sprintf((char*)pLog, "设置[%s]非阻塞方式连接失败", pszIP);
    return false;
    }
    nRet= connect(sock,(LPSOCKADDR)&sTestPoint,sizeof(sTestPoint)); //select 模型,即设置超时
    struct timeval timeout ;
    fd_set r; FD_ZERO(&r);
    FD_SET(sock, &r); timeout.tv_sec = m_nTimeOut; //连接超时
    timeout.tv_usec =0; nRet = select(0, 0, &r, 0, &timeout); if (nRet <= 0 )
    {
    char pLog[100];
    sprintf((char*)pLog, "无法连通[%s]的[%d]端口", pszIP, nPort);
    ::closesocket(sock);
    return false;
    }//do something............ shutdown(sock, 1);
    closesocket(sock);
      

  2.   

    nRet= connect(sock,(LPSOCKADDR)&sTestPoint,sizeof(sTestPoint)); nRet = select(0, 0, &r, 0, &timeout); if (nRet <= 0 ) 

    char pLog[100]; 
    ...
    } 请问这里的 nRet 是哪个的返回值了 程序上是 select 的返回
      

  3.   

    nRet 当然是select的返回值。
    这些代码是项目代码中的一部分,已经测试通过的。
      

  4.   

    代码我编译是没有问题的 我想问的是:   当运行到    nRet= connect(sock,(LPSOCKADDR)&sTestPoint,sizeof(sTestPoint));    nRet = -1 说明没有连接上   当运行到
       nRet = select(0, 0, &r, 0, &timeout);    nRet  = 1 ;说明有返回   那么就会继续执行,这样下面的一些操作都是在没有连接成功的情况
       下执行的,所以我后面的发送的请求没有得到数据
      

  5.   

    nRet  = 1
    说明已经连接成功了。