求教:epoll的ET模式对EPOLLOUT事件怎么处理的?
时间:2010-07-28
来源:互联网
以前写过一个epoll LT模式的网游服务器的socket通信架构;
据说ET模式在大连接情形下更高效,但是更难用;
LT似乎是关注资源,ET关注事件;
只要资源还有,LT就会通知你;
只要新资源到达,ET也会通知你;但是如果你不用完,又没有新资源到达,就不再理你了。剩下的资源。。浪费着。。
关于recv的两种方式处理还是很好理解;
但是至今没想通关于send的处理;
因为linux下有个“bug”,epoll对EPOLLOUT事件总会返回真(只要你的内核发送缓冲区有1个字节的空间)。
不知道该怎么处理。。。
求解。。。
据说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也为真...
最近因为服务器移植到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模式在大连接情形下更高效,但是更难用 ...
okocha-jay 发表于 2010-07-28 15:59
ET模式下,epoll理论上是当发送缓冲区由满变为不满,即有空闲空间了,会触发EPOLLOUT事件,但正如你所说“linux下有个“bug”,epoll对EPOLLOUT事件总会返回真(只要你的内核发送缓冲区有1个字节的空间)。”,我的做法是把fd放到可写队列中,如果fd已经在这个队列中则不重复放,如果没有在这个队列中(由满变为不满时),则放入这个队列,另外一个任务去读取这个队列,操作send
作者: rain_fish 发布时间: 2010-07-28
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28