我在启动服务器后,然后在启动客户端,遇到了这样的一个问题,请大家为我讲解一下,谢谢了!!!下面是我客户端连接服务器的代码
BOOL ConnectServer(void)
{
int reVal; //返回值
sockaddr_in serAddr;//服务器地址

serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(5555);
serAddr.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”); for (;;)
{
//连接服务器,sClient是非阻塞模式的套接字
reVal = connect(sClient, (struct sockaddr*)&serAddr, sizeof(serAddr));

//处理连接错误
if(SOCKET_ERROR == reVal)
{
int nErrCode = WSAGetLastError();
if( WSAEWOULDBLOCK == nErrCode ||//连接还没有完成
 WSAEINVAL == nErrCode)
{
//问题就在这里 Sleep(TIMEFOR_THREAD_SLEEP);
continue;
}else if (WSAEISCONN == nErrCode)//连接已经完成
{
break;
}else//其它原因,连接失败
{
return FALSE;
}
}

if ( reVal == 0 )//连接成功
break;
} bConnecting = TRUE; return TRUE;
}上面我注释的Sleep函数是我后来加上去的,如果加上去了,程序运行就很正常,如果没有加上去,始终都是连接不上服务器!!!
然而,我调试的时候,单步执行时即使不加上Sleep()函数也会连接成功!!!!这个问题让我很困惑!!,为什么让主线程睡一下就可以连接上服务器了呢???

解决方案 »

  1.   

    一般非阻塞,你连接后在循环内使用select()去检测套接字的读写状态.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))
     {
     IsFlag = TRUE;
         break;
     }
     else
     {
     break;
     }
     }
     return IsFlag;
    }IsFlag为TRUE是证明是连接上.
      

  2.   

    谢谢你的答复啊~~~对于select()函数我还没有学习到,但是我马上就会学了!!只是可以给我解释一下,为什么主线程睡一下就可以了!!!???
      

  3.   

    死循环里最好sleep下.不然CPU100%...程序会死掉.