非阻塞模式

使用阻塞模式的时候,设想客户端与服务器通讯的时候,既不发数据,又不收数据,让服务器端的recv一直在等待,占着连接不拉shi,这样岂不是很恶心

那么可以通过下面的调用将一个SOCKET显示的设置于非阻塞工作模式:

u_long iMode = 1;
//-------------------------
// Set the socket I/O mode: In this case FIONBIO
// enables or disables the blocking mode for the 
// socket based on the numerical value of iMode.
// If iMode = 0, blocking is enabled; 
// If iMode != 0, non-blocking mode is enabled.

iResult = ioctlsocket(m_socket, FIONBIO, &iMode);

大致意思就是在socket句柄上调用一个ioctlsocket 
设置它的值 iMode=1 属性的常量 FIONBIO NBIO实际上是non-blocking

QQ截图20190108122234.png

非阻塞模式不一定是异步模式,它仅仅是忽略了等待的过程,但是它接收的时候仍然是同步的操作

SOCKET设置为非阻塞模式后,处理收发数据或处理连接的SOCKET API调用都会立即返回 如 accept()的调用,但是它在返回之前,恰好有connect()请求在队列上等待,那么它就会真正完成一次完整的操作,它仍然是同步的操作,只是忽略了等待的过程,如果返回时,需要的操作没有实际完成,此时这些函数会返回一个错误码WSAEWOULDBLOCK,这时就需要重复调用相应的函数直到需要的操作成功的完成

 

非阻塞accept

在阻塞模式下accept函数会一直等到有客户端调用connect连接进来才返回,并且返回的代表与客户端通信的SOCKET也是阻塞模式的

在非阻塞模式下如果accept成功返回一个SOCKET句柄,那么这个句柄不用设置,自动也是非阻塞模式的

本博客所有文章如无特别注明均为原创。作者:odaycaogen复制或转载请以超链接形式注明转自 123``blog
原文地址《非阻塞模式

相关推荐

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)