我在启动服务器后,然后在启动客户端,遇到了这样的一个问题,请大家为我讲解一下,谢谢了!!!下面是我客户端连接服务器的代码
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()函数也会连接成功!!!!这个问题让我很困惑!!,为什么让主线程睡一下就可以连接上服务器了呢???
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()函数也会连接成功!!!!这个问题让我很困惑!!,为什么让主线程睡一下就可以连接上服务器了呢???
{
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是证明是连接上.