大致就是先设置非阻塞的,然后connent,然后再用select模型中的select函数控制。
//设置非阻塞方式连接
unsigned long ul = 1;
int ret;
ret = ioctlsocket(m_sock, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)
return FALSE;
::connect(m_sock,(sockaddr *)&m_ServerAddr,sizeof(sockaddr_in));
//select 模型,即设置超时
struct timeval timeout ;
fd_set r;
FD_ZERO(&r);
FD_SET(m_sock, &r);
timeout.tv_sec = 2; //连接超时2秒
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if(ret<=0)
{
::closesocket(m_sock);
return false;
}
//一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式
unsigned long ul1= 0 ;
ret = ioctlsocket(m_sock, FIONBIO, (unsigned long*)&ul1);
if(ret==SOCKET_ERROR)
{
::closesocket(m_sock);
return false;
}
return true;
//设置非阻塞方式连接
unsigned long ul = 1;
int ret;
ret = ioctlsocket(m_sock, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)
return FALSE;
::connect(m_sock,(sockaddr *)&m_ServerAddr,sizeof(sockaddr_in));
//select 模型,即设置超时
struct timeval timeout ;
fd_set r;
FD_ZERO(&r);
FD_SET(m_sock, &r);
timeout.tv_sec = 2; //连接超时2秒
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if(ret<=0)
{
::closesocket(m_sock);
return false;
}
//一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式
unsigned long ul1= 0 ;
ret = ioctlsocket(m_sock, FIONBIO, (unsigned long*)&ul1);
if(ret==SOCKET_ERROR)
{
::closesocket(m_sock);
return false;
}
return true;