【发布时间】:2014-07-27 01:02:45
【问题描述】:
我正在构建一个在线游戏客户端,当我尝试连接到离线服务器时,我的客户端冻结了,所以我想使用适合游戏的非阻塞套接字,因为在连接到服务器时需要完成其他任务.
在使用非阻塞套接字时,connect函数无论结果如何总是返回相同的值,所以这里的人们推荐使用select函数来查找连接请求的结果。
(连接前设置非阻塞socket)
u_long iMode=1;
ioctlsocket(hSocket,FIONBIO,&iMode);
(设置套接字集)
FD_ZERO(&Write);
FD_ZERO(&Err);
FD_SET(hSocket, &Write);
FD_SET(hSocket, &Err);
TIMEVAL Timeout;
int TimeoutSec = 10; // timeout after 10 seconds
Timeout.tv_sec = TimeoutSec;
Timeout.tv_usec = 0;
int iResult = select(0, //ignored
NULL, //read
&(client.Write), //Write Check
&(client.Err), //Error Check
&Timeout);
if(iResult)
{
}
else
{
message_login("Error","Can't connect to the server");
}
select 函数总是返回 -1,为什么?
【问题讨论】:
-
Write 是否与 client.Write 相同? Err 是否与 client.Err 相同? hSocket 来自哪里?您在 iResult==0 情况下的错误消息不正确。
-
如果
iResult == -1=> msdn.microsoft.com/en-us/library/windows/desktop/…,您还应该检查WSAGetLastError的错误代码 -
是的,它与我所说的相同,它是我的代码的一部分,因为它不在一个文件中,不管它返回什么,但它总是返回相同的东西
-
您之前是否调用过 WSAStartup ?