免费注册 查看新帖 |

Chinaunix

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

socket 超时问题如何解决 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-07-25 09:45 |只看该作者
原帖由 maxmaxsh 于 2008-7-25 09:34 发表


所以我期望有一个方法,让socket recv 超时的时候,以结果集的方式返回,这样会好很多。当然有更好的思想也可以提。

结果集是 什么? 其实在一个线程或进程里面epoll多个socket, timeout其实起不了什么作用.
比如你poll3个socket,a,b,c ,其中c是连接进来后一直没有发数据,但a,b却是数据不停,那你永远也不会超时.

论坛徽章:
0
22 [报告]
发表于 2008-07-25 10:20 |只看该作者
比如你poll3个socket,a,b,c ,其中c是连接进来后一直没有发数据,但a,b却是数据不停,那你永远也不会超时.

但a,b却是数据不停 那么epoll_wait 是会返回的。
此时返回的结果集就是a,b. 在返回以后扫描所有的socket记录,就可以知道c是否超时了。

只是如果返回的结果很多就会有我说的问题了。

我希望在c 读操作超时的时候, 它以结果集的形式返回, 那么我继可以单独处理a, b, c 在处理到c
的时候,我通过计算时间点,就知道是什么情况,就可以断开他, 就可以免除扫描所有的socket,以及维护那个队列的开销了。

论坛徽章:
0
23 [报告]
发表于 2008-07-25 10:31 |只看该作者
LZ的愿望是好的, 但是好像没有这种功能。 你这种实际上是要求socket能够在连接闲置长时间后通知你,据以往的经验,没有这种功能。 只得自己判断。

论坛徽章:
0
24 [报告]
发表于 2008-07-25 10:55 |只看该作者

回复 #17 maxmaxsh 的帖子

为什么提到apache keepalive的实现就是因为和你的需求比较相似,都是需要处理客户端和服务器端不按常理出牌没有协商的情况,在网络上存在大量浏览器客户端建立了到服务器的连接但长时间又不请求的情况可能比你说的telnet更极端。

  实现这样检测的想法也很简单,因为超时毕竟不是很紧急的处理而且不是很频繁,所以占用多个处理线程明显不和理,所以需要有个单独线程检测,我上面说的epoll线程就起到的是这个作用。在这个线程里如果epoll_wait超时,那就由他检测下timeout队列,如果有事件发生,同样在将相应的事件交到队列后也检测下超时队列。
    可能你会担心你的epoll线程不能即时处理你的新的大量并发连接,其实apache 在这点上倒不会,因为它其实是多进程在epoll_wait的,也就是说他是有多进程+线程池的方式,一个忙别的没关系,一个死掉甚至也没关系,尽量兼顾稳定和效率。而且这种使用方法在大多数平台的下是不要加锁的,是安全的。

我说的只是apache的实现,不见得一定满足你的需求。

[ 本帖最后由 zhoubug 于 2008-7-25 10:57 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2008-07-25 11:13 |只看该作者
多进程在epoll_wait的,也就是说他是有多进程+线程池的方式

具体怎么做的呢?

先将epoll socket 建立起来。 然后建立子进程?

每个子进程都共享这个epollsocket. 然后个字获取epoll_wait?

论坛徽章:
0
26 [报告]
发表于 2008-07-25 11:15 |只看该作者
原帖由 gateh 于 2008-7-25 10:31 发表
LZ的愿望是好的, 但是好像没有这种功能。 你这种实际上是要求socket能够在连接闲置长时间后通知你,据以往的经验,没有这种功能。 只得自己判断。

已经猜到是这个结局了。在win32的iocp也存在着相类似的问题,也是一样的答案。这个问题不解决也许没问题,也可能很严重。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
27 [报告]
发表于 2008-07-25 11:19 |只看该作者
我靠..我发现你们都在空想. 去看一下libevent的代码吧..又不多

论坛徽章:
0
28 [报告]
发表于 2008-07-25 11:32 |只看该作者
原帖由 cookis 于 2008-7-25 11:19 发表
我靠..我发现你们都在空想. 去看一下libevent的代码吧..又不多


not空想 已经实现,全球都在跑

论坛徽章:
0
29 [报告]
发表于 2008-07-25 11:45 |只看该作者
libevent 也是一个rb树, 和hashmap没什么区别。

RB_ENTRY (event) ev_timeout_node;

如果能做到我所说的情况,这个根本不需要。

我提的问题,不是无法解决,而是如果更高效。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
30 [报告]
发表于 2008-07-25 12:00 |只看该作者
原帖由 maxmaxsh 于 2008-7-25 11:45 发表
libevent 也是一个rb树, 和hashmap没什么区别。

RB_ENTRY (event) ev_timeout_node;

如果能做到我所说的情况,这个根本不需要。

我提的问题,不是无法解决,而是如果更高效。


谁说是rb树. 是堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP