以SOCKET连接的connect()函数为例,如果连接不上,会产生长时间的阻塞。
解决方法:
可以将SOCKET设置成非阻塞,然后select等待返回结果,等连接上了再设置成阻塞,代码如下:
int iMode = 1;
ioctlsocket(m_cmdSock, FIONBIO, (u_long FAR*) &iMode);
struct timeval timeout;
bool bCon = true;
if (SOCKET_ERROR == connect(m_cmdSock,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))
{
FD_ZERO(&r);
FD_SET(m_cmdSock,&r);
timeout.tv_sec = 3;
timeout.tv_usec = 0;
ret = select(0,0,&r,0,&timeout);
if (ret > 0)
{
getsockopt(m_cmdSock, SOL_SOCKET, SO_ERROR, (char*)(&error), &len);
if(error == 0)
{
bCon = true;
}
else
{
bCon = false;
}
}
else
{
bCon = false;
}
}
else
{
bCon = true;
}