免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6011 | 回复: 12
打印 上一主题 下一主题

[C++] 请教几个EPOLL问题~ [复制链接]

论坛徽章:
1
白羊座
日期:2013-10-17 23:11:46
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-06 12:13 |只看该作者 |倒序浏览
写了个TCP客户/服务器程序,在服务器端加入了epoll处理fd事件,遇到了几个问题~
1、由于epoll在处理对端SOCKET关闭的时候,上报EPOLLIN事件,导致与客户端socket有数据read混淆,现在有一种比较土的方法就是调read函数,当read函数返回0的时候
    表示对端socket关闭了,这种方法有个明显的缺陷,当socket确实读到文件末尾返回0(对端socket未关闭),这个时候不能将客户端fd从epoll中删除,有没有好的方法解决
    该问题?
2、将fd注册到epoll的时候指定监听的事件类型为EPOLLIN事件,为什么会报EPOLLIN以外的事件?
3、epoll_create的参数size用来告诉内核监听的fd数目,我将该参数设置为1,按理说epoll应该只能关心一个fd,为什么还是可以关注多个fd的事件?
4、LT和ET工作方式,以ET工作方式加入epoll,我不去处理fd的epoll事件,为什么会一直上报该fd的事件,ET工作方式不是只报一次的吗?

Test.zip (2.11 KB, 下载次数: 15)




论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-04-06 12:19 |只看该作者
1, 没看懂, read=0怎么会让read混淆
2, 默认EPOLLHUP+EPOLLERR, 除非你设置EPOLLONSHOT才会在下一次触发后帮你彻底清除所有事件注册.
3, 这个参数已经废弃了, 内核不会参考你的值.
4, 一拨数据只报一次, 如果再来一拨还是会报的.

论坛徽章:
1
白羊座
日期:2013-10-17 23:11:46
3 [报告]
发表于 2013-04-06 13:23 |只看该作者
本帖最后由 popkart718 于 2013-04-06 13:25 编辑

回复 2# linux_c_py_php


    1、当read确实读到文件末尾返回0(对端socket未关闭)和对端socket关闭混淆,服务端不能区分这两种情况
    4、客户端socket关闭,服务器epoll上报EPOLLIN事件,此时不将客户socket从epoll中删除,会一直上报EPOOLIN事件

论坛徽章:
0
4 [报告]
发表于 2013-04-06 15:41 |只看该作者
楼主用的应该是LT模式吧?在LT模式下只要缓冲区可写就会不断的触发EPOOLIN
具体用法可以参考:http://kenby.iteye.com/blog/1162853

论坛徽章:
0
5 [报告]
发表于 2013-04-06 18:59 |只看该作者
新手学习了啊

论坛徽章:
1
白羊座
日期:2013-10-17 23:11:46
6 [报告]
发表于 2013-04-06 20:39 |只看该作者
回复 4# netcos


    再请教一下,当客户端有数据发送到服务端的时候触发EPOLLIN事件,那么什么时候触发服务器EPOLLOUT事件?

论坛徽章:
0
7 [报告]
发表于 2013-04-06 20:52 |只看该作者
回复 6# popkart718


   如果你服务器有数据要写的时候手动更改epoll的状态来触发写事件:
                ev.data.fd = fd;  
                ev.events = events.events | EPOLLOUT;  
                if (epoll_ctl(epfd, EPOLL_CTL_MOD, fd, &ev) == -1) {  
                    perror("epoll_ctl: mod");  
                }

论坛徽章:
1
白羊座
日期:2013-10-17 23:11:46
8 [报告]
发表于 2013-04-06 20:57 |只看该作者
回复 7# netcos


    只要调用函数epoll_ctl(epfd, EPOLL_CTL_MOD, fd, &ev) 更改epoll的fd注册事件就可以触发相应的事件吗?

论坛徽章:
0
9 [报告]
发表于 2013-04-06 21:03 |只看该作者
回复 8# popkart718


    只要缓冲区可写,更改成EPOLLOUT状态后即可触发

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
10 [报告]
发表于 2013-04-07 10:22 |只看该作者
popkart718 发表于 2013-04-06 12:13
3、epoll_create的参数size用来告诉内核监听的fd数目,我将该参数设置为1,按理说epoll应该只能关心一个fd,为什么还是可以关注多个fd的事件?


那个参数应该是历史遗留问题, 当前实现只要该参数 > 0 即可, 无论你传1 还是1000, 都一个效果
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP