epoll et模式的epollout事件问题

来源:14-7 水平触发&边缘触发

Mr__Xin

2022-05-11

老师您说在et时epollout事件只有在不可写到可写的转变时刻,才会触发一次,也就是只在写缓冲区从满到非满触发一次。那么请问我如何确定这个socket何时写缓冲区为空(发完数据)呢?只能在这次触发之后把这个socket的epoll_event改成lt才能判断吗?

写回答

2回答

长歌_吴从周

2022-05-12

你表达更准确通顺一些,我不明白你的意思。

0
2
长歌_吴从周
回复
Mr__Xin
1)如果缓冲区有空闲了,会再次触发事件,你就可以继续往里面再写数据;2)你不用管缓冲区中的数据什么时候发送完,那是tcp底层的事情。你可能又会问如果缓冲区中的数据没发送完网络就断开了,那怎么办? 这个需要用其它的手段来保证业务的完整性。
2022-05-12
共2条回复

暖火UP

2022-05-11

 if (errno == EAGAIN)    // 这个东西应该等于 EWOULDBLOCK
        {
            // 内核缓冲区满,这个不算错误
            return -1;      // 表示发送缓冲区满了
        }

我记得是判断错误号errno来判断缓冲区状态,如果发送缓冲区满了,会调用send会返回EAGAIN这个错误。应该是

0
2
Mr__Xin
哈哈没事,我问的是et模式咋判断socket发完数据了,不然除非设置keep alive,很难确定什么时候关掉。
2022-05-11
共2条回复

C/C++气象数据中心实战,手把手教你做工业级项目

通过技术的实际应用,掌握等同2年经验的技术能力

968 学习 · 401 问题

查看课程