Epoll有两种模式,LT模式 与 ET模式。默认情况下是LT模式,由于ET模式在高并发,高流量的情况下,处理效率会高于ET模式,所以也就采用了ET模式。
服务器一直运行良好,跑几千机器人也没有什么问题。但突然之间发现,机器人在反复掉线上线的测试后,会出现一种情况:服务器端会再也收不到客户端的连接事件,或者这个连接事件响应会非常慢,而已连接成功的fd读写数据是没有任何问题的。
我不知道是不是只有我才遇到了这个问题,网上也没有能找到相关其它人给出的解决办法。
最后的解决办法大概如下,如果没有遇到问题的则不用了,难道只有我才遇到这个问题吗:
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); }
Epoll 连接无响应或响应时间过长,布布扣,bubuko.com
原文:http://blog.csdn.net/aizquan/article/details/20543747