请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

epoll et模式的epollout事件问题

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

正在回答 回答被采纳积分+3

2回答

长歌_吴从周 2022-05-12 09:13:58

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

0 回复 有任何疑惑可以回复我~
  • 提问者 Mr__Xin #1
    就是说既然et模式时的epollout事件只在写缓冲区满到有空触发一次,那我如何确定什么时候写缓冲区为空,也就是怎么确定什么时候发完数据。
    回复 有任何疑惑可以回复我~ 2022-05-12 20:38:17
  • 长歌_吴从周 回复 提问者 Mr__Xin #2
    1)如果缓冲区有空闲了,会再次触发事件,你就可以继续往里面再写数据;2)你不用管缓冲区中的数据什么时候发送完,那是tcp底层的事情。你可能又会问如果缓冲区中的数据没发送完网络就断开了,那怎么办? 这个需要用其它的手段来保证业务的完整性。
    回复 有任何疑惑可以回复我~ 2022-05-12 21:58:52
暖火UP 2022-05-11 19:03:44
 if (errno == EAGAIN)    // 这个东西应该等于 EWOULDBLOCK
        {
            // 内核缓冲区满,这个不算错误
            return -1;      // 表示发送缓冲区满了
        }

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

0 回复 有任何疑惑可以回复我~
  • 好像有点答非所问,忽略忽略,打扰了
    回复 有任何疑惑可以回复我~ 2022-05-11 19:05:04
  • 提问者 Mr__Xin #2
    哈哈没事,我问的是et模式咋判断socket发完数据了,不然除非设置keep alive,很难确定什么时候关掉。
    回复 有任何疑惑可以回复我~ 2022-05-11 19:45:03
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信