免费注册 查看新帖 |

Chinaunix

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

[Linux] c++编程 epoll模型编程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-28 13:30 |只看该作者 |倒序浏览
epoll主动关闭一个没有心跳的套接字后
会自动跳到重新连接函数(accept());


///////////////////服务器主动关闭客户端
if (time(NULL) - iter->second.last_active > s_nSecond)
{
                        printf("del no heart beat sock\n");
                        EpollCloseSock(sock);
                        close(sock);
                        sock = EX_SOCK_INVALID;
}

////
void EpollCloseSock(int sockfd)
{
        printf("Dev Close Sock :%d\n",sockfd);
        EpollDel(sockfd);
        m_MapBuf[sockfd] = "";
}

////
void EpollDel(int sock)
{

        struct epoll_event ev;
        ev.events = EPOLLIN|EPOLLET;
        ev.data.fd = sock;

        if(epoll_ctl(m_epfd, EPOLL_CTL_DEL, sock, &ev) < 0)
        {
            perror("epoll_ctl:EPOLL_CTL_DEL");
        }
}

//////以上是代码的部分功能,请各路高手帮我分析原因。

//Accept
        if (pEvent->data.fd == lisSocket)
        {
                if(pEvent->events & EPOLLIN)
                {

                        int confd = 0;
                        while (true)
                        {
                                confd = EpollAccept();  //每次主动关闭客户端的时候,客户端会自动重连。
                                if (confd > 0)
                                {
                                       
                                        AddOneConnection(confd);
                                        SetNonBlocking(confd);
                                        EpollAddNewClient(confd);
                                }
                                else
                                {
                                        if(errno == EAGAIN)
                                        {
                                                break;
                                        }
                                }
                        }
                }
               
        }
        else if(pEvent->events & EPOLLIN)
        //if(pEvent->events & EPOLLIN)
        {
                if (pEvent->data.fd <= 0)
                {
                        return;
                }
                Read(pEvent->data.fd);
        }

论坛徽章:
0
2 [报告]
发表于 2015-04-28 13:30 |只看该作者
求高手指点......

论坛徽章:
4
双子座
日期:2014-08-28 10:08:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯之阿联酋
日期:2015-03-13 03:25:15
3 [报告]
发表于 2015-04-28 13:37 |只看该作者
指点个毛线啊,你问题都没描述清楚,不知道你要问什么

论坛徽章:
0
4 [报告]
发表于 2015-04-28 14:34 |只看该作者
回复 3# weishuo1999


   我的问题就是:
      服务器epoll这边主动关闭客户端一个连接后,客户端并没有断开,而是又立马自动连上了;定时时间一到,关闭客户端后,又会调用那个EpollAccept()函数。
请帮欧文分析下原因吧!

论坛徽章:
4
双子座
日期:2014-08-28 10:08:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯之阿联酋
日期:2015-03-13 03:25:15
5 [报告]
发表于 2015-04-28 16:51 |只看该作者
客户端的代码是怎么写的,有没有可能客户端有自动重连功能?回复 4# wenliang1387


   

论坛徽章:
0
6 [报告]
发表于 2015-04-28 17:27 |只看该作者
回复 5# weishuo1999


    应该不是客户端的问题
在windows系统(iocp)关闭就不会;这个客户端我是用的tcp调试助手。

论坛徽章:
2
2015年亚洲杯之乌兹别克斯坦
日期:2015-04-15 15:43:482015亚冠之迪拜阿赫利
日期:2015-06-30 20:36:46
7 [报告]
发表于 2015-04-29 17:48 |只看该作者
抓包看看不就清楚了,怀疑是客户端自动重连了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP