c - epoll模型ET模式非阻塞

查看:153
本文介绍了c - epoll模型ET模式非阻塞的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

网上资料说ET模式下,只会通知一次,不会再次通知事件,所以必须等数据全部写入或者全部读取才能再次调用epoll_wait。

但是为什么要用非阻塞socket,阻塞socket不是也能通过while循环来将数据全部写入或者全部读取吗?

解决方案

这是从实际应用考虑的,阻塞跟ET搭配起来会有问题的

只说读的情况:

ET只有来数据时才会提醒,因此读数据时,你必须一次性地把缓冲区的数据读完(如果不读完,则缓冲区还残留着未读数据,然后对端又不继续发数据的话,ET是不会再通知你,也就是说你将永远读不到残留数据)

为了一次性把缓冲区数据读完,你必须要写一个while循环来read,直到缓冲区里面数据被读完,

如果设成阻塞的话,你的程序就无法知道数据什么时候被读完,因为当数据读完时,会卡在while里面的read,一直在等数据,永远退不出while

如果设成非阻塞,当数据被读完,read就会返回,然后将errno设成EAGAIN并退出while这才是正确的逻辑

这篇关于c - epoll模型ET模式非阻塞的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆