+ -
当前位置:首页 → 问答吧 → 求教:epoll的ET模式对EPOLLOUT事件怎么处理的?

求教:epoll的ET模式对EPOLLOUT事件怎么处理的?

时间:2010-07-28

来源:互联网

以前写过一个epoll LT模式的网游服务器的socket通信架构;

据说ET模式在大连接情形下更高效,但是更难用;


LT似乎是关注资源,ET关注事件;

只要资源还有,LT就会通知你;

只要新资源到达,ET也会通知你;但是如果你不用完,又没有新资源到达,就不再理你了。剩下的资源。。浪费着。。


关于recv的两种方式处理还是很好理解;


但是至今没想通关于send的处理;

因为linux下有个“bug”,epoll对EPOLLOUT事件总会返回真(只要你的内核发送缓冲区有1个字节的空间)。

不知道该怎么处理。。。

求解。。。

作者: okocha-jay   发布时间: 2010-07-28

本帖最后由 okocha-jay 于 2010-07-28 16:13 编辑

最近因为服务器移植到linux,正好想重新改一下。

网上找的
With EPOLLET, EPOLLOUT will be triggered once at the start, and never again
until after you've filled the send buffer and a send would block, and some room
comes available again.

可是我测得ET模式下,只要EPOLLIN了,OUT也为真...

作者: okocha-jay   发布时间: 2010-07-28

我是这样做的,给每个连接一个bool记录是否可写,初始值为true。每次write的时候看能不能把待发送的数据发完,能的话就认为该连接还是可写的,如果不能发完那么就认为内核的缓冲区已经满了,记录为不可写。当触发out事件时就再尝试一下write,然后再根据write结果更新是否可写的bool。只要把fd设置为非阻塞的就可以了,最多就是多了几次无效的write尝试而已。

作者: sjinny   发布时间: 2010-07-28



QUOTE:
以前写过一个epoll LT模式的网游服务器的socket通信架构;

据说ET模式在大连接情形下更高效,但是更难用 ...
okocha-jay 发表于 2010-07-28 15:59




    ET模式下,epoll理论上是当发送缓冲区由满变为不满,即有空闲空间了,会触发EPOLLOUT事件,但正如你所说“linux下有个“bug”,epoll对EPOLLOUT事件总会返回真(只要你的内核发送缓冲区有1个字节的空间)。”,我的做法是把fd放到可写队列中,如果fd已经在这个队列中则不重复放,如果没有在这个队列中(由满变为不满时),则放入这个队列,另外一个任务去读取这个队列,操作send

作者: rain_fish   发布时间: 2010-07-28

相关阅读 更多

热门下载

更多