免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wyezl

epoll模型的使用及其描述符耗尽问题的探讨 [复制链接]

论坛徽章:
0
发表于 2006-08-20 11:25 |显示全部楼层
accept()之后的epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &ev);
要改成:if (epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &ev)<0) close(cfd);
估计就是这里错吧,这几率比较小,
所以出现“fd在经历一段时间后渐渐丢失”

另外还要考虑playmud挑的4点问题,
比如第一点,lz那样写的while好像跟if差不多,
accept也是在很小几率下出错,出错之后程序就退出?

说的不对的话,请指正!

论坛徽章:
0
发表于 2006-08-20 12:58 |显示全部楼层
原帖由 思一克 于 2006-8-18 15:58 发表
想帮你实验,但程序无法编译


编译没问题,需要linux 2。6以上内核的支持。

论坛徽章:
0
发表于 2006-08-20 13:10 |显示全部楼层
[quote]



挑挑错吧,说的不对的话,请见谅!
1,    while ((cfd = accept(fd, (struct sockaddr *)&cin, &sin_len)) > 0)
    可够改成
while(1)
cfd = accept(fd, (struct sockaddr *)&cin, &sin_len;
if(cfd>0)
..
2,你是要让客户端发送一次就不再发送了吗?


CODE:[Copy to clipboard]                if(events[i].events & EPOLLIN)
                {
                    cfd = events[ i ].data.fd;
                    ret = recv(cfd, buffer, sizeof(buffer),0);
                    //printf("read ret..........= %d\n",ret);

                    ev.data.fd = cfd;
                    ev.events = EPOLLOUT | EPOLLET;
                    epoll_ctl(epfd, EPOLL_CTL_MOD, cfd, &ev);
                }
3,将accept事件列入epoll监控的对象
4,对close最好做一个判断





... [/quote]

1,如果描述符已经耗尽,这样判断cfd永远不会成立。所以就让它退出算了。

2,我只取http请求的头信息的第一行。 get  /xxx  http/1.0 做简单分析,其他的都不要了。按照tcp协议的特点,本应该多次读取的,但测试发现,只读一次就能得到我想要的,基本上没出过错。
里面的数据没读完就留那了,会不会对以后的请求造成什么不好的影响?


3,accept是在住线程里跑,加入了epoll有什么好处吗?

4,对close没做判断,这点确实是遗漏了。我得补上。
谢谢你的建议。

[[i] 本帖最后由 wyezl 于 2006-8-20 13:16 编辑 [/i]]

论坛徽章:
0
发表于 2006-08-20 13:14 |显示全部楼层
原帖由 tysn 于 2006-8-20 11:25 发表
accept()之后的epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &ev);
要改成:if (epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &ev)<0) close(cfd);
估计就是这里错吧,这几率比较小,
所以出现“fd在经历一段时间 ...


这一条判断我后来添加了。 但这儿出错几率几乎为0 。


现在仍未发现耗尽的原因。怀疑是不是epoll机制本身有问题呢?

论坛徽章:
0
发表于 2006-08-21 09:41 |显示全部楼层
继续顶。。。。。。。。。

论坛徽章:
0
发表于 2006-08-21 09:49 |显示全部楼层
EPOLLIN事件后是不是应该关闭CFD?

我看的,不一定准确,因为无法实验你的程序

论坛徽章:
0
发表于 2006-08-21 12:14 |显示全部楼层
原帖由 思一克 于 2006-8-21 09:49 发表
EPOLLIN事件后是不是应该关闭CFD?

我看的,不一定准确,因为无法实验你的程序


如果关闭了,以后就不会有EPOLLOUT了。 因为我是接受请求,然后返回所请求的信息。

论坛徽章:
0
发表于 2006-08-21 12:18 |显示全部楼层
那你把能编译的贴出,我帮你实验。如果你愿意的话

论坛徽章:
0
发表于 2006-08-21 12:34 |显示全部楼层
不懂  什么是epoll,哪位兄弟给解释一下

论坛徽章:
0
发表于 2006-08-21 16:47 |显示全部楼层
原帖由 思一克 于 2006-8-21 12:18 发表
那你把能编译的贴出,我帮你实验。如果你愿意的话


我贴出的代码就是能编译的。
请问你用的是什么操作系统? 版本?
这个程序只能在linux上运行,而且内核版本必须在2.6以上。

[ 本帖最后由 wyezl 于 2006-8-21 16:52 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP