WSAAsyncSelect自动把一个阻塞的socket转为非阻塞的,如果需要转为阻塞的,那么先要调用这个函数,并且最后一个参数long lEvent设置为0 ,然后调用ioctlsocket或者WSAIoctl设置为阻塞。
// MSDN:The WSAAsyncSelect function automatically sets socket s to nonblocking mode, regardless of the value of lEvent. To set socket s back to blocking mode, it is first necessary to clear the event record associated with socket s via a call to WSAAsyncSelect with lEvent set to zero. You can then call ioctlsocket or WSAIoctl to set the socket back to blocking mode.
设置为阻塞的:
u_long iMode = 0; // set blocking.
ioctlsocket( m_hSocket, FIONBIO, &iMode );
ioctlsocket( m_hSocket, FIONBIO, &iMode );
一旦设置了阻塞,我想,还是加个超时的好:
DWORD dwRecvTimeout = 5000; // 5 sec timeout;
setsockopt( m_hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&dwRecvTimeout, sizeof(DWORD) );
setsockopt( m_hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&dwRecvTimeout, sizeof(DWORD) );