免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cookis
打印 上一主题 下一主题

epoll 边缘触发模式的问题 [复制链接]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
21 [报告]
发表于 2008-11-07 12:29 |只看该作者
试验的如何了?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
22 [报告]
发表于 2008-11-07 13:53 |只看该作者
我找到问题了.

在我的库中我没有调用recv 直到返回 EAGAIN. 而是认为 只是是返回原长度小于请求的长度就不再recv了..
因为我在手册中看到这么一句:

  1.               Q9     Do I need to continuously read/write an fd until EAGAIN when using the EPOLLET flag ( Edge Triggered behaviour ) ?

  2.               A9     No  you  don’t.  Receiving  an event from epoll_wait(2) should suggest to you that such file descriptor is ready for the requested I/O
  3.                      operation. You have simply to consider it ready until you will receive the next EAGAIN. When and how you will use such file descriptor
  4.                      is  entirely  up to you. Also, the condition that the read/write I/O space is exhausted can be detected by checking the amount of data
  5.                      read/write from/to the target file descriptor. For example, if you call read(2) by asking to read a certain amount of data and read(2)
  6.                      returns  a  lower  number  of bytes, you can be sure to have exhausted the read I/O space for such file descriptor. Same is valid when
  7.                      writing using the write(2) function.
复制代码


不过这样好像多调用一次recv. 按理说返回原长度小于请求的长度 就是已经表示缓冲区已空, 就已经是EWOULDBLOCK了.

这样看来还不如用水平触发方式.

[ 本帖最后由 cookis 于 2008-11-7 14:03 编辑 ]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
23 [报告]
发表于 2008-11-07 14:13 |只看该作者
lunix man 里说的意思就是 返回原长度小于请求的长度时,可以说recv缓冲区里已经没有数据了,也就达到了和EWOULDBLOCK一样的意思


另外,你能帮我测试一下我说的那个方法吗?因为很想知道其结果

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
24 [报告]
发表于 2008-11-07 14:18 |只看该作者
原帖由 chenzhanyiczy 于 2008-11-7 14:13 发表
lunix man 里说的意思就是 返回原长度小于请求的长度时,可以说recv缓冲区里已经没有数据了,也就达到了和EWOULDBLOCK一样的意思


另外,你能帮我测试一下我说的那个方法吗?因为很想知道其结果


这样一来测试也就没意义了. 只要不是返回errno == EWOULDBLOCK. 就肯定会存在问题.

所以当判断返回长度小于请求长度时,,一定要再调一次recv

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
25 [报告]
发表于 2008-11-07 14:22 |只看该作者
我测了下..客户端停顿一下再close. 就能检测到关闭事件了.. 显然epoll会把它当做新的事件来判断.

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
26 [报告]
发表于 2008-11-07 14:29 |只看该作者
哈哈,看来跟我想象的差不多了,

好像你理解的和我理解的有点出入

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
27 [报告]
发表于 2008-11-07 15:17 |只看该作者
好像epoll得实现方法和select完全不一样

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
28 [报告]
发表于 2008-11-07 15:45 |只看该作者
select是水平模式.

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
29 [报告]
发表于 2008-11-07 17:48 |只看该作者
是得,没错,select只有LT,epoll有LT和ET

论坛徽章:
0
30 [报告]
发表于 2008-11-07 18:17 |只看该作者
这种状况只出现在客户端发出一个包含数据的TCP segment之后没有等服务器ACK到来就立即发送FIN的情形。这就是为什么客户端发送完毕数据之后sleep一段时间就能够正常终止连接的原因。所以如果要建立一个健壮的服务器,就必须在服务器端收到客户端的事件之后循环read直到EAGAIN为止。
我一直认为这是epoll的一个bug。不知道有没有人这么看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP