采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师您说在et时epollout事件只有在不可写到可写的转变时刻,才会触发一次,也就是只在写缓冲区从满到非满触发一次。那么请问我如何确定这个socket何时写缓冲区为空(发完数据)呢?只能在这次触发之后把这个socket的epoll_event改成lt才能判断吗?
你表达更准确通顺一些,我不明白你的意思。
就是说既然et模式时的epollout事件只在写缓冲区满到有空触发一次,那我如何确定什么时候写缓冲区为空,也就是怎么确定什么时候发完数据。
1)如果缓冲区有空闲了,会再次触发事件,你就可以继续往里面再写数据;2)你不用管缓冲区中的数据什么时候发送完,那是tcp底层的事情。你可能又会问如果缓冲区中的数据没发送完网络就断开了,那怎么办? 这个需要用其它的手段来保证业务的完整性。
if (errno == EAGAIN) // 这个东西应该等于 EWOULDBLOCK { // 内核缓冲区满,这个不算错误 return -1; // 表示发送缓冲区满了 }
我记得是判断错误号errno来判断缓冲区状态,如果发送缓冲区满了,会调用send会返回EAGAIN这个错误。应该是
好像有点答非所问,忽略忽略,打扰了
哈哈没事,我问的是et模式咋判断socket发完数据了,不然除非设置keep alive,很难确定什么时候关掉。
登录后可查看更多问答,登录/注册
通过技术的实际应用,掌握等同2年经验的技术能力
603 3
947 20
973 11
974 10
717 7