免费注册 查看新帖 |

Chinaunix

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

epoll的各个事件触发条件测试 [复制链接]

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-12 23:04 |只看该作者 |倒序浏览
1、listen fd,有新连接请求,触发EPOLLIN。
2、对端发送普通数据,触发EPOLLIN。
3、带外数据,只触发EPOLLPRI。
4、对端正常关闭(程序里close(),shell下kill或ctr+c),触发EPOLLIN和EPOLLRDHUP,但是不触发EPOLLERR和EPOLLHUP。
    关于这点,以前一直以为会触发EPOLLERR或者EPOLLHUP。
    再man epoll_ctl看下后两个事件的说明,这两个应该是本端(server端)出错才触发的。
5、对端异常断开连接(只测了拔网线),没触发任何事件。

论坛徽章:
0
2 [报告]
发表于 2009-03-13 08:51 |只看该作者
拔网线是很难测试
一般应该是应用层想办法检测
比如超时心跳检查
一般靠应用层协议可靠设计来避免吧

论坛徽章:
0
3 [报告]
发表于 2009-03-13 09:15 |只看该作者
支持一下LZ

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
4 [报告]
发表于 2009-03-13 09:22 |只看该作者

回复 #2 gawk 的帖子

恩,了解。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
5 [报告]
发表于 2009-03-13 13:29 |只看该作者

回复 #2 gawk 的帖子

能用应用都得有起码的超时检测

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
6 [报告]
发表于 2009-03-13 13:44 |只看该作者

回复 #5 xinglp 的帖子

就是间隔规定时间段心跳啊。

论坛徽章:
0
7 [报告]
发表于 2009-03-13 15:31 |只看该作者

回复 #1 yangsf5 的帖子

再man epoll_ctl看下后两个事件的说明,这两个应该是本端(server端)出错才触发的。

EPOLLERR事件:客户端用VC 写得,程序运行,发完消息后让程序sleep 然后直接关闭dos 小黑框的关闭按钮,服务端就会触发EPOLLERR事件。


在服务的程序里加上
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 18; // 如该连接在18秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
setsockopt(Accept_sd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive)) ;
               
setsockopt(Accept_sd, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle)) ;
        
setsockopt(Accept_sd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval)) ;                                       
setsockopt(Accept_sd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount)) ;

如果拔掉网线就可以在自己设定的时间内检测到  EPOLLERR事件

[ 本帖最后由 liujq110 于 2009-3-13 15:33 编辑 ]

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
8 [报告]
发表于 2009-03-13 15:52 |只看该作者

回复 #7 liujq110 的帖子

1、奇怪,我的EPOLLERR就是触发不了啊。触发都是EPOLLRDHUP
难道是版本不同?

2、SO_KEEPALIVE
设置这个选项,并将时间间隔设置短些,这个确实是可以来检测拔线类的问题,
只是这个选项的时间被修改,会影响其他使用了这个选项的程序的间隔时间。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP