在连接服务器时,有时长时间连接不上,就一直阻塞在那里不动了,有时是接收数据时也会出现这种问题。
我想用定时器来处理一下,比如连接阻塞超过20秒我就再连接一次,如果还不行就不连了,请问怎么处理?
我的连接函数为ConnectServer(strIp,nPort);

解决方案 »

  1.   

    用select函数好像可以设置,不过我遇到这个问题使用多线程解决的 
      

  2.   

    1.将socket设置为非阻塞struct timeval ConnectionTimeOut;
     ConnectionTimeOut.tv_sec  = 8;
     ConnectionTimeOut.tv_usec = 0;
    while(TRUE)
     {
         iRet = connect(ClientSocket, (LPSOCKADDR)&ssin, sizeof(SOCKADDR_IN));
         if (iRet == SOCKET_ERROR)
     {
         if (WSAGetLastError() != WSAEWOULDBLOCK)
     {
     break;
     }
     }
         else
     {
     IsFlag = TRUE;
         break;
     }  FD_ZERO(&fdwrite);
     FD_ZERO(&fdexcept);
         FD_SET(ClientSocket,&fdwrite);
     FD_SET(ClientSocket,&fdexcept);
         select(0,NULL,&fdwrite,&fdexcept,&ConnectionTimeOut);  if (FD_ISSET(ClientSocket,&fdexcept)) // 出现错误
     {
     break;
     }     if (FD_ISSET(ClientSocket,&fdwrite))  // 成功连接上
     {
         break;
     }
     else
     {
     break;
     }
     }
    以上代码就是8秒超时连接
      

  3.   

    不行啊 还是阻塞在CONNECT上了
      

  4.   

    使用非阻塞SOCK,创建一个事件,绑定该SOCKET的FD_CONNECT事件,投递完CONNECT后使用
    DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 函数的第二个参数就是你要设置的超时时间,通过判断WaitForSingleObject的返回值就可以知道是超时还正常返回了
      

  5.   

    setsockopt 就可以轻松设置发送和接受超时.