Epoll 连接无响应或响应时间过长

Epoll有两种模式,LT模式 与 ET模式。默认情况下是LT模式,由于ET模式在高并发,高流量的情况下,处理效率会高于ET模式,所以也就采用了ET模式。

服务器一直运行良好,跑几千机器人也没有什么问题。但突然之间发现,机器人在反复掉线上线的测试后,会出现一种情况:服务器端会再也收不到客户端的连接事件,或者这个连接事件响应会非常慢,而已连接成功的fd读写数据是没有任何问题的。


主要的原因还是因为ET模块的代码编写要求比较高,LT模式就像汽车的自动档,你只要挂上档,就能把速度搞上去。而ET模式有点像汽车的手动档,任何时候变速都是需要你自己操作的。LT是条件触发,只要满足条件,是一直触发,直到你把它处理完成。而ET有点类型是事件触发,发生了某个事件的时候,他只触发一次,如果这一次你没能在逻辑里写处理好,那就不会再触发了,那这个事件的处理就被丢失。


所以我的问题应该还是没能把ET模式用好,最后的解决办法大概如下,还原回了默认的方式:


bind(listenfd,(sockaddr *)&serveraddr, sizeof(serveraddr));
listen(listenfd, LISTENQ);
ev.data.fd=listenfd;
//ev.events=EPOLLIN|EPOLLET;
ev.events=EPOLLIN;//监听的FD 用默认的EPOLLLT模式

if(events[i].data.fd==listenfd)   //如果新监测到一个SOCKET用户连接到了绑定的SOCKET端口,建立新的连接。
   {
        connfd = accept(listenfd,(sockaddr *)&clientaddr, &clilen);
        if(connfd<0){
             perror("connfd<0");
             return (1);
         }
         
       setnonblocking(connfd);
       ev.data.fd=connfd;

       //ev.events=EPOLLIN | EPOLLET;
       ev.events=EPOLLIN;//这里也用默认的EPOLLLT模式

       epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);
     }


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值