设置非阻塞网络I/O

举报
看,未来 发表于 2021/12/24 21:00:58 2021/12/24
【摘要】 话不多说,放码过来。// 设置一个文件描述符为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);
}

  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)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。