目的:想让套接字连接不成功后,返回的速度快一点
代码如下:
         cli.sin_addr.s_addr=inet_addr("10.1.11.101");
cli.sin_family=AF_INET;
cli.sin_port=htons(8000);

clisock=socket(AF_INET,SOCK_STREAM,0);


struct timeval m_tm;
m_tm.tv_sec=5000;
m_tm.tv_usec=0;

setsockopt(clisock,SOL_SOCKET, SO_RCVTIMEO, (char *)&m_tm, sizeof(m_tm));


int connerror=connect(clisock,(sockaddr*)&(cli),sizeof(cli));
        if (connerror!=0) {
shutdown(clisock,SB_BOTH);
closesocket(clisock);
return;//连接不成功,返回
        }
现在的问题是如果套接字连接不成功,要等大概20秒才能返回,请问各位怎样才能让这个时间缩短啊??
先谢了~~~

解决方案 »

  1.   

    //连接超时
        //--------------------------------------------------------------------------
        //设置为非阻塞方式连接
        unsigned long ul = 1;
        int ret = ioctlsocket(m_sSocket, FIONBIO, (unsigned long*)&ul);
        if(ret == SOCKET_ERROR)
        {
            err = WSAGetLastError();
      closesocket(m_sSocket);
      m_sSocket = NULL;
      return FALSE;
        } struct         timeval timeout ;  // 超时结构
        fd_set         r;                          FD_ZERO(&r);
        FD_SET(m_sSocket, &r);
        timeout.tv_sec = iTimeout;   // 连接超时设置
        timeout.tv_usec =0;    connect(m_sSocket,(LPSOCKADDR)&server,sizeof(SOCKADDR));
        ret = select(0, 0, &r, 0, &timeout);  
        if ( ret <= 0 )
        {
      err = WSAGetLastError();
      closesocket(m_sSocket);
      m_sSocket = NULL;
      return FALSE;
        } //设回阻塞模式
        ul = 0 ;
        ret = ioctlsocket(m_sSocket, FIONBIO, (unsigned long*)&ul);
        //--------------------------------------------------------------------------
    //接收超时
        //-------------------------------------------
        //接收超时设置
        struct         timeval outtime ;  // 超时结构    FD_SET fdr = {1, m_sSocket}; 
        outtime.tv_sec = timeout;  
        outtime.tv_usec =0;
        int nSelectRet;
        //------------------------------------------------------------
        //网络只认单字节串,而EVC里多字节;发送的UNICODE串转换成单字节串
        UINT nLen = len * 2;
        char *pByte = new char[nLen+1];
        memset(pByte, 0, nLen+1);
        WideCharToMultiByte(CP_ACP, NULL, buf, wcslen(buf),pByte, nLen, NULL, NULL);
        int nRet;    nSelectRet=::select(0, &fdr, NULL, NULL, &outtime); //检查可读状态 
        if(SOCKET_ERROR==nSelectRet) 
        {
     err = WSAGetLastError();
     closesocket(m_sSocket);
     m_sSocket = NULL;
     return -1;
        }
        if(nSelectRet==0) //超时发生,无可读数据 
        {
     AfxMessageBox(L"接收超时");
     err = WSAGetLastError();
     closesocket(m_sSocket);
     m_sSocket = NULL;
     return -1;
        }
        else 
        {
     //接收数据
     nRet = recv(m_sSocket, pByte, nLen, 0);
     if(nRet == SOCKET_ERROR)
     {
      err = WSAGetLastError();
     }
        }    //-------------------------------------------    MultiByteToWideChar(CP_ACP, NULL, pByte, nLen, buf, len);
        delete [] pByte;
        pByte = NULL;
     
        //---------------------------------------------------------------------
      

  2.   

    程序执行到ret = select(0, 0, &r, 0, &timeout);  的时候就执行不下去了,郁闷~~~
      

  3.   

    timeout.tv_sec = 3;   // 连接超时设置 注意这个设置是秒!!!!!!