ret = select(0, 0, &r, 0, &timeout); if ( ret <= 0 ) { ::closesocket(m_sck); return false; }
//再设回阻塞模式 unsigned long ul1= 0 ; ret = ioctlsocket(m_sck, FIONBIO, (unsigned long*)&ul1); if(ret==SOCKET_ERROR) { ::closesocket (m_sck); return false; }
//设置非阻塞方式连接 unsigned long ul = 0; int ret = ioctlsocket(m_sck, FIONBIO, (unsigned long*)&ul);这个因为ul=0;其实是阻塞 FIONBIO Use with a nonzero argp parameter to enable the nonblocking mode of socket s. The argp parameter is zero if nonblocking is to be disabled.
//设置非阻塞方式连接
unsigned long ul = 0;
int ret = ioctlsocket(m_sck, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR){return 0;}
int iResult = ::connect(m_sck,(sockaddr*)&m_netaddr,sizeof(m_netaddr));
//select 模型,即设置超时
fd_set r;
FD_ZERO(&r);
FD_SET(m_sck, &r);
struct timeval timeout ;
timeout.tv_sec = 1; //连接超时1秒
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
::closesocket(m_sck);
return false;
}
//再设回阻塞模式
unsigned long ul1= 0 ;
ret = ioctlsocket(m_sck, FIONBIO, (unsigned long*)&ul1);
if(ret==SOCKET_ERROR)
{
::closesocket (m_sck);
return false;
}
unsigned long ul = 0;
int ret = ioctlsocket(m_sck, FIONBIO, (unsigned long*)&ul);这个因为ul=0;其实是阻塞
FIONBIO
Use with a nonzero argp parameter to enable the nonblocking mode of socket s. The argp parameter is zero if nonblocking is to be disabled.
http://topic.csdn.net/u/20110902/11/ADA2AC00-0BC4-461F-8417-4026435CE577.html#r_75330540