免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2008-07-25 22:30 |只看该作者
原帖由 cookis 于 2008-7-25 12:00 发表


谁说是rb树. 是堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.堆.


堆也存在这个问题啊, 没有跳过去。

论坛徽章:
0
32 [报告]
发表于 2008-07-27 11:07 |只看该作者

回复 #13 maxmaxsh 的帖子

epoll 为何不能超时返回 ?

epoll_wait 函数不是有一个参数吗?

  #include <sys/epoll.h>

       int  epoll_wait(int  epfd,  struct epoll_event * events, int maxevents,
       int timeout)

不解

论坛徽章:
0
33 [报告]
发表于 2008-07-27 11:30 |只看该作者
原帖由 todaygood 于 2008-7-27 11:07 发表
epoll 为何不能超时返回 ?

epoll_wait 函数不是有一个参数吗?

  #include

       int  epoll_wait(int  epfd,  struct epoll_event * events, int maxevents,
       int timeout)

不解



描述上的问题, 我指的是 如果recv 超时, 不能通过epoll 的返回结果来表示出来。

比如epoll_wait 超时返回了,我并不知道那个socket 超时了, 还是必须扫描所有的socket.

epoll_Wait 超时返回 只是提供了一个机会给我们可以进行扫描所有的socket.

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

但a,b却是数据不停 那么epoll_wait 是会返回的。
此时返回的结果集就是a,b. 在返回以后扫描所有的so ...



我的理解也是“比如你poll3个socket,a,b,c ,其中c是连接进来后一直没有发数据,但a,b却是数据不停,那你永远也不会超时.”

LZ的结论有测试过吗?是否正确?

论坛徽章:
0
35 [报告]
发表于 2008-07-29 23:15 |只看该作者
对这个不是很懂哈,不过有个问题,你的socket连接处理程序不是自己在处理吗?不能在处理函数中加入定时器?如果能,当定时器到时没有数据包就将该连接断掉不可以吗?

论坛徽章:
0
36 [报告]
发表于 2008-07-30 14:02 |只看该作者
这么一个小问题,已经4页了楼主也没搞懂。
epoll_wait里可以监听指针的,不必要是网络fd,可以把fd和一个结构体关联,这个结构体里除了有fd,还有一个定时器。定时器超时,把这个fd写到一个管道里,管道的读端放到epoll_wait里面监听,发现管道有数据,读出来,把那个fd咔嚓掉。
这个描述够清晰了吧。

select的话,同样可以,可以用fd数组和定时器数组,用下标关联。
至于性能,new结构体的时候小心点,总是在epoll_wait的唤醒线程里new和malloc就好了,避免锁。
就是需要实现一个高效的定时器。libevent实现的也是so so

论坛徽章:
0
37 [报告]
发表于 2008-07-30 15:12 |只看该作者
目前的逻辑结构。

main thread ....  业务处理。

互斥量 x 以及x 保护的列表 Lx

thread 1  主动连接连接 建立socket 对象和业务对象, 包括启动时间  锁住互斥量x  将fd 加入Lx
thread 2  主动建立连接 建立socket 对象和业务对象, 包括启动时间  锁住互斥量x  将fd 加入Lx
..
..
..

thread 10 while (1) epoll_wait();


互斥量y   以及y保护的列表 Ly
当thread 10 返回或超时

thread10 处理所有的返回信息,逻辑处理,从ly 找出fs 所指的socket 对象, 修改它们的上次读时间
         将read==0 的fd 断开, 从Ly 中删除, 删除socket 对象和业务对象
         锁住 将Lx 中的数据 读出, 将映射关系加入Ly, 并且将Lx 的fd 加入epoll fd
         计算时间间隔, 比如每100次返回。扫描整个Ly 然后断开 Ly中 长时间没有连接的fd

效率低下的地方
        
   thread 10 返回只能10 自己处理,所以没有发挥多核的威力。如果改成多线程会好很多。 目前也可以直接在thread 10返回后 用其他的 thread 11 - thread 19
对epoll_wait 返回的数据进行操作,但是考虑到重入等很多问题,暂时没有加

当不使用互斥量 x 的时候, thread 1 将 fd  直接加入epollfd ,而epoll_waite 正在运行是否会有问题? 为避免这个问题
我加了x 来完成。

目前这套模型,我觉得效率不高,但是单机起x000 socket 还是可以,cpu占有并不高。因为环境问题,wan很难达到3000 socket 同时连接的情况(1M ADSL), lan的话,(apache)被连的服务器又吃不肖。

ls的说一下, 你修改的地方在那里吗?
你说的定时器,在那里加,当定时器中断的时候,是中断在里呢?  

是否取消互斥量y以及ly

将thread 10调整为

处理所有的返回信息,逻辑处理,从ly 找出fs 所指的socket 对象, 修改它们的定时器
将read==0 的fd 断开, 删除逻辑对象
锁住 将Lx 中的数据 读出, 将映射关系加入Ly, 并且将Lx 的fd 加入epoll fd, 设置它们的定时器?


但是定时器中断返回的时候,是否会影响到epoll_wait函数的正常运行呢?

论坛徽章:
0
38 [报告]
发表于 2008-07-30 16:27 |只看该作者
我对voipexplore 的理解是,每次fd 和定时器一起列表 Lx里,然后“定时器超时,把这个fd写到一个管道里,管道的读端放到epoll_wait里面监听,发现管道有数据,读出来,把那个fd咔嚓掉。”,不用列表 Ly来处理了

论坛徽章:
0
39 [报告]
发表于 2008-07-31 10:58 |只看该作者
up

论坛徽章:
0
40 [报告]
发表于 2008-10-28 17:20 |只看该作者
我没用过epoll,如果它将socket和timer做了封装映射,那挺好用的,以前都是利用select然后自己做的映射,有机会试下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP