设置非阻塞网络I/O
【摘要】 话不多说,放码过来。// 设置一个文件描述符为nonblockint set_nonblocking( int fd){ int flags; if ((flags = fcntl(fd, F_GETFL, 0)) == -1) flags = 0; return fcntl(fd, F_SETFL, flags | O_NONBLOCK);...
话不多说,放码过来。
// 设置一个文件描述符为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);
}
- read总是在接收缓冲区有数据时立即返回,而不是等到给定的read buffer填满时返回。(一次会返回好多,如果不加限制的话)
只有当receive buffer为空时,blocking模式才会等待,而nonblock模式下会立即返回-1(errno = EAGAIN或EWOULDBLOCK)
- blocking的write只有在缓冲区足以放下整个buffer时才返回(与blocking read并不相同)
nonblock write则是返回能够放下的字节数,之后调用则返回-1(errno = EAGAIN或EWOULDBLOCK)
对于blocking的write有个特例:当write正阻塞等待时对面关闭了socket,则write则会立即将剩余缓冲区填满并返回所写的字节数,再次调用则write失败(connection reset by peer)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)