免费注册 查看新帖 |

Chinaunix

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

关于epoll事件触发的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-11 09:43 |只看该作者 |倒序浏览
大家好:
     在学习的过程中遇到一个问题,再做底层通信的时候选择的是用epoll来管理所有的链接,用epoll_wait来等待所有的事件触发,然后针对不同的事件、不同的socket做不同的处理,当对端主动关闭了socket的时候会触发一个EPOLLIN事件,在这里可以对这个socket做响应的处理(以这个socket为关键字关联了一些其他的数据,当socket被关闭了之后需要释放这些数据所占用的内存),

问题:如果我想主动地关闭一个socket的时候,我也想同样触发一个事件让epoll_wait返回,同在这个线程中释放这些数据所占的内存,我发现在我主动close一个socket的时候不会触发任何事件让epoll_wait返回?
请问我的这种想法是不是不可行?

论坛徽章:
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
2 [报告]
发表于 2011-01-11 13:26 |只看该作者
注意自己的业务逻辑,保证关掉这个socket并释放相关资源后,不会再次操作这个"socket"和相关资源就可以

论坛徽章:
0
3 [报告]
发表于 2011-01-11 13:50 |只看该作者
回复 2# xinglp


    现在我就是这么实现的,觉得这样有时候不太好用,所以想在同一个地方去释放,不知道可否像我上面说的那样去实现。暂时不知道如何触发一个事件使wpoll_wait返回,
开始想了通过shutdown来关闭写操作,让其触发EPOLLHUP,发现还是不会触发。再看ACE的时候看到在处理close的时候主动close和对方close的处理是不同。

论坛徽章:
0
4 [报告]
发表于 2011-01-11 17:42 |只看该作者
调close(sock),tcp层发FIN,本地是不会触发read&write事件的。tcp层传FIN&ACK如果出错的话,倒有可能触发EPOLLERR(我只是理论分析,不确定)。

论坛徽章:
0
5 [报告]
发表于 2011-01-11 19:36 |只看该作者
兄弟你是不是想客户端关闭Socket时服务端要收到这个消息,并换醒你的线程进行相关处理?

论坛徽章:
0
6 [报告]
发表于 2011-01-12 08:59 |只看该作者
回复 5# nhuczp


    多谢兄弟回复,客户端关闭连接的时候服务端会触发EPOLLIN事件,服务端有时候也会主动的和别的服务器建立连接,当任务处理完之后需要断开这个链接,这时候如何触发epoll_wait返回呢?
这个socket会关联到一些其他的数据,当socket关闭时候需要释放这些数据,当然可以再外部来保存这些数据,我在想能否在同一个地方来释放这些数据呢?也就是在服务端主动断开了一个连接也触发epoll_wait返回,在后面来处理这个socket所关联的数据。

论坛徽章:
0
7 [报告]
发表于 2011-01-12 09:55 |只看该作者
回复  nhuczp


    多谢兄弟回复,客户端关闭连接的时候服务端会触发EPOLLIN事件,服务端有时候也会主 ...
yang_crystal 发表于 2011-01-12 08:59



    如果服务端主动关闭你可以通过在epoll 中添加一个本地的Socket(套节字域) 当需要的时候的就通过本地套节字域发送一个消息,去触发epoll_wait 然后先关后清。

感觉你的设计有点问题。

论坛徽章:
0
8 [报告]
发表于 2011-01-12 10:12 |只看该作者
回复 6# yang_crystal


    大致明白你的意思了。

    其实在理论上来讲,如果服务端主动断开一个连接的话,是不可能触epoll_wait事件的,所以想要通过epoll_wait事件来处理socket X关闭之后的一些资源回收的话,不太可行。

   但是可以建议如下方案:自定义一个内部socket  A,也使用epoll_wait它的事件,当你的客户端主动调用close方法关闭socket X的连接时,同时向那个内部socket A发送一些数据,可以触发该socket A的读事件就可以了,然后在它的读回调里进行Socket X资源回收处理就OK了,不知道我说明白了没有,或者你有没有理解?

论坛徽章:
0
9 [报告]
发表于 2011-01-12 10:50 |只看该作者
回复 8# foolishx


        多谢楼上两位的回复
  我明白兄台的意思,你的这个方法不错,不知道在实际应用中有没有人遇到同样的问题?有没有其他的解决方法?

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
10 [报告]
发表于 2011-01-23 14:28 |只看该作者
大家好:
     在学习的过程中遇到一个问题,再做底层通信的时候选择的是用epoll来管理所有的链接,用epol ...
yang_crystal 发表于 2011-01-11 09:43



    你不知道是IN了还是break了,可以读一下,返回-1,并errno,可以说明是break了,进行善后处理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP