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);
     }


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
epoll客户端连接成功后,它会触发自己的connect实践。connect实践是指客户端与服务器建立连接之后,进行的一系列操作。 首先,连接成功后,客户端需要向服务器发送一条请求。这可以是一个HTTP请求,一个数据库查询请求或者任何需要发送到服务器的数据。客户端会将请求数据按照服务器的要求进行封装,并通过已连接的套接字将请求发送出去。 接下来,客户端会等待服务器的响应。它会使用epoll实例监视已连接的套接字,当有数据可读时,epoll会通知客户端进行读取操作。客户端会根据服务器的响应进行相应的处理,例如解析响应的数据、提取所需信息等。 在处理完服务器的响应后,客户端可能会继续发送其他请求或者关闭连接。如果客户端需要保持长连接,它可以选择继续发送请求,或者等待一段时间后再发送下一个请求。 在整个连接过程中,客户端需要处理各种可能的异常情况,例如连接超时连接断开等。当连接发生异常时,客户端的connect实践会根据具体情况进行相应的处理,例如重新建立连接、释放资源等。 总结来说,epoll客户端连接成功后触发自己的connect实践主要包括发送请求、接收服务器的响应、处理响应数据以及处理连接异常情况等。通过这些操作,客户端能够与服务器进行有效的通信,并根据具体需求进行相应的处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值