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) );
本文介绍如何使用WSAAsyncSelect将阻塞的socket转换为非阻塞模式,并提供将其重新设置为阻塞模式的方法。此外还讨论了设置超时的重要性。
2585

被折叠的 条评论
为什么被折叠?



