免费注册 查看新帖 |

Chinaunix

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

客户端 连接成功 服务端却检测不到 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-17 22:13 |只看该作者 |倒序浏览
遇到了一个奇怪的问题,我起了100线程,同时连接服务端,客户端显示都连接成功(connect 没有报错),可是服务端检测到有60~90的连接数,有时候能检测到100个连接

我的监听端结构如下:难道这个结构有问题??  谢谢指点



SOCKET = CreateSocket();
BindSocket();
ListenSocket();

int epoll_fd, actfd;
struct epoll_event ev, events[10000];
epoll_fd = epoll_create( 10000 );

ev.data.fd = SOCKET;
ev.events = EPOLLIN|EPOLLET;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, SOCKET, &ev);

int        curfds = 1;
while(1)
{

        actfd = epoll_wait(epoll_fd, events, curfds, 1);// 1 毫秒
        for  (i = 0; i < actfd; ++i)
        {
                if  (events.data.fd == SOCKET)
                {
                        if ((AcceptFd = AcceptSocket()) == -1)
                        {
                                continue;
                        }
                        
                        //将AcceptFd 加入到 list 队列中去
                        
                        ev.data.fd = AcceptFd;
                        ev.events = EPOLLERR|EPOLLPRI|EPOLLIN|EPOLLET;
                        epoll_ctl(epoll_fd, EPOLL_CTL_ADD, AcceptFd, &ev);
                        curfds ++
                }
                else        if(events.events&EPOLLIN)
                {
                        if   (MyIOCtl(events.data.fd) == 0)//触发可读事件但IO里没有数据,认为是客户端关闭
                        {
                                close(events.data.fd);
                                curfds --;
                                continue;
                        }
                       //Socket 加入 到 list 里并通知接收
                       epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events.data.fd, &ev);// epoll事件集合中删除
                }
                if  (events.events&EPOLLERR)
                {
                        epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events.data.fd, &ev);
                        close(events.data.fd);
                        curfds --;
                }
        }
} //end while

[ 本帖最后由 liujq110 于 2009-4-17 22:17 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-17 23:51 |只看该作者
LZ帖子的第一句后面部分【可是服务端检测到有60~90的连接数,有时候能检测到100个连接】 不连贯 我没怎么看懂
另外 我不知道你是怎么检测 连接数 的?

论坛徽章:
0
3 [报告]
发表于 2009-04-18 00:08 |只看该作者

回复 #2 lenky0401 的帖子

是 多次测试  有时连接成功 60  有时连接成功 70  等  
有时 连接成功 100  (客户端100 并发连接)

检测 连接数:调用一次 accept  连接数+1

论坛徽章:
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
4 [报告]
发表于 2009-04-18 02:45 |只看该作者
请参考这篇文章,  高并发下epoll接受连接不完整的原因分析  绝对能解决你的问题.

[ 本帖最后由 xinglp 于 2009-4-18 03:01 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-04-18 20:18 |只看该作者

回复 #4 xinglp 的帖子

thank you very much

论坛徽章:
0
6 [报告]
发表于 2009-04-20 14:42 |只看该作者
原帖由 liujq110 于 2009-4-17 22:13 发表
if  (events.data.fd == SOCKET)
                {
                        if ((AcceptFd = AcceptSocket()) == -1)
                        {
                                continue;
                        }

                        
                        //将AcceptFd 加入到 list 队列中去
                        
                        ev.data.fd = AcceptFd;
                        ev.events = EPOLLERR|EPOLLPRI|EPOLLIN|EPOLLET;
                        epoll_ctl(epoll_fd, EPOLL_CTL_ADD, AcceptFd, &ev);
                        curfds ++
                }


You are under edge triggerred mode, so you must continue to call the accept function until the errno is set to EAGAIN or EWOULDBLOCK.
You can refer my codes at http://libasdl.svn.sourceforge.n ... ver.cpp?view=markup in line 365.

[ 本帖最后由 swxlion 于 2009-4-20 14:44 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-04-20 14:47 |只看该作者
你在ET模式下面,所以要一直accept一直到出错为止.

论坛徽章:
0
8 [报告]
发表于 2009-04-21 22:14 |只看该作者
问题题 解决 非常感谢 4,6,7楼 呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP