我用epoll_wait来监听端口事件,但是有的时候能够监听到对方的close(),有时候就检测不到,从而产生大量close_wait问题,咋破啊

epoll是否使用了Edge Trigger模式?在这种模式下,EPOLLIN事件只会产生一次,recv读到-1 且errno=EAGAIN为止,下一个EPOLLIN事件才会产生。在Edge Trigger模式下,EPOLLIN事件的正确逻辑应该是这样:while true { ret = recv(fd, buffer); if (ret \u0026lt; 0) { if (errno == EAGAIN) break; else close(fd); // Error occured } else if (ret \u0026gt; 0) { F(buffer);//Process data } else if (ret == 0) { close(fd); }}根据我的猜测,题主应该没有检查过ret \u0026lt; 0的情况。而在Level Trigger模式下应该不会有遗漏事件的问题。
■网友
errno=EAGAIN时再close,ET模式下,ret\u0026lt;0和==0都需要检测,个人觉得ET和LT在低负载短连接下差别不是很大,但高负载时ET性能还是更为优越写
■网友
使用水平触发 不要用边缘触发


    推荐阅读