epoll模型ET模式非阻塞
网上资料说ET模式下,只会通知一次,不会再次通知事件,所以必须等数据全部写入或者全部读取才能再次调用epoll_wait。
但是为什么要用非阻塞socket,阻塞socket不是也能通过while循环来将数据全部写入或者全部读取吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
网上资料说ET模式下,只会通知一次,不会再次通知事件,所以必须等数据全部写入或者全部读取才能再次调用epoll_wait。
但是为什么要用非阻塞socket,阻塞socket不是也能通过while循环来将数据全部写入或者全部读取吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
这是从实际应用考虑的,阻塞跟
ET
搭配起来会有问题的只说读的情况:
ET
只有来数据时才会提醒,因此读数据时,你必须一次性地把缓冲区的数据读完(如果不读完,则缓冲区还残留着未读数据,然后对端又不继续发数据的话,ET
是不会再通知你,也就是说你将永远读不到残留数据)为了一次性把缓冲区数据读完,你必须要写一个
while
循环来read
,直到缓冲区里面数据被读完,如果设成阻塞的话,你的程序就无法知道数据什么时候被读完,因为当数据读完时,会卡在
while
里面的read
,一直在等数据,永远退不出while
如果设成非阻塞,当数据被读完,read就会返回,然后将
errno
设成EAGAIN
并退出while
,这才是正确的逻辑阻塞socket会存在一个问题,如果在接收的过程中出现一个client的网络突然中断,或者机器突然崩溃之类的异常,那么这个socket就会阻塞在recv,这样是非常影响性能的。而非阻塞socket就不会影响到其他连接的处理