socket DataSocket = socket(AF_INET,SOCK_STREAM,0);
WSAAsyncSelect(DataSocket, Window, WM_TCPDATASOCKET,FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);
connect(DataSocket, (const SOCKADDR *)&ServerAddress,sizeof(ServerAddress));以上代码,connect()被执行时,如果连接远程的服务器不在线的话,一般要等10多秒才会返回连接不上远程服务器的错误,我想问有没有什么方法可以令这个超时缩短,例如我想在6秒内连接不上,就返回错误.
WSAAsyncSelect(DataSocket, Window, WM_TCPDATASOCKET,FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);
connect(DataSocket, (const SOCKADDR *)&ServerAddress,sizeof(ServerAddress));以上代码,connect()被执行时,如果连接远程的服务器不在线的话,一般要等10多秒才会返回连接不上远程服务器的错误,我想问有没有什么方法可以令这个超时缩短,例如我想在6秒内连接不上,就返回错误.
int ret = ioctlsocket(m_Socket, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)
{
int erro = WSAGetLastError();
TRACE("ioctlsocket erro\n");
ASSERT(FALSE);
return FALSE;
}
m_bClosing.False(); connect(m_Socket,(struct sockaddr *)&server,sizeof(server));
struct timeval timeout ;
fd_set r;
FD_ZERO(&r);
FD_SET(m_Socket, &r);
timeout.tv_sec = 5; //连接超时15秒
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
int ret = WSAGetLastError();
TRACE("连接失败: %d\n",ret);
m_bIsConnected = FALSE;
OnClose();
return FALSE;
}
你不等5秒,谁来知道结果呢?
WSAAsyncSelect(DataSocket, Window, WM_TCPDATASOCKET,FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);
这句已经将socket设置为异步的了.select()是阻塞的,异步都不存在阻塞的,如果你不明白何为异步,没必要回答这问题.我没说二楼的是错误的,我只是说他的回答,根本就不符合我的要求.他的方法是在非阻塞的socket中设置超时,这个我是会的,但我的程序是异步的.
异步,英文为Asynchronous;非阻塞,英文为Non-Blocking.或者单单从字眼中很难判断是否一样的东西,请看以下国外一个游戏编程网的一些资料.
http://www.gamedev.net/reference/programming/features/asyncsock/default.asp看完后再看看谁是菜鸟.
一般要等10多秒才会返回连接不上远程服务器的错误,我想问有没有什么方法可以令这个超时缩短,例如我想在6秒内连接不上,就返回错误
-------------
我上面的代码就可以完成他想要的结果。至于你所说的异步和非阻塞的关系,我并没有表明他们之间的关系。只是你自己认为我那样认为。
我不喜欢研究文字的一些东西,能达到想要达到的目的就行了。