设置非阻塞网络I/O

Posted 看,未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设置非阻塞网络I/O相关的知识,希望对你有一定的参考价值。

话不多说,放码过来。


// 设置一个文件描述符为nonblock
int  set_nonblocking( int  fd)
{
     int  flags;
     if  ((flags = fcntl(fd, F_GETFL, 0)) == -1)
         flags = 0;
     return  fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}

  1. read总是在接收缓冲区有数据时立即返回,而不是等到给定的read buffer填满时返回。(一次会返回好多,如果不加限制的话)

只有当receive buffer为空时,blocking模式才会等待,而nonblock模式下会立即返回-1(errno = EAGAIN或EWOULDBLOCK)

  1. blocking的write只有在缓冲区足以放下整个buffer时才返回(与blocking read并不相同)

nonblock write则是返回能够放下的字节数,之后调用则返回-1(errno = EAGAIN或EWOULDBLOCK)

对于blocking的write有个特例:当write正阻塞等待时对面关闭了socket,则write则会立即将剩余缓冲区填满并返回所写的字节数,再次调用则write失败(connection reset by peer)

以上是关于设置非阻塞网络I/O的主要内容,如果未能解决你的问题,请参考以下文章

网络I/O模型--03非阻塞模式(ServerSocket与Socket的超时处理)--解除accept() read()方法阻塞

五种网络IO模型-阻塞I/O非阻塞I/OI/O多路复用信号驱动I/O异步I/O

简明网络I/O模型---同步异步阻塞非阻塞之惑

简明网络I/O模型---同步异步阻塞非阻塞之惑

网络I/O模型--04非阻塞模式(解除accept() read()方法阻塞)的基础上加入多线程技术

使用 asyncio 的非阻塞 I/O