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

来源:互联网 发布:c语言!=是什么意思 编辑:程序博客网 时间:2024/04/27 19:06

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 0
原创粉丝点击