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