Linux 非阻塞 epoll 编程中,如何解决大量 ESTABLISHED 连接后占着茅坑不拉屎的行为?

查看 21|回复 0
作者:huahsiung   
Linux socket 中,无论是
server_fd = socket(AF_INET, SOCK_STREAM, 0);
listen(server_fd)
还是接过来的
client_fd=accept(server_fd)
全部加进 epoll 事件监听中。
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client_fd, &ev)
但是接到的 client_fd ,必须要收到对方发送数据才能激活事件。
如果对方一直不 send()任何数据。那么建立了 ESTABLISHED 连接后就占着茅坑不拉屎。epoll 也不会通知
网上找到两个方法:
1.
epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
改为
epoll_wait(epoll_fd, events, MAX_EVENTS, 10);
没用,这是 epoll 事件超时,而不是连接超时。
epoll_wait 返回的是活跃事件,如果不发送任何数据,epoll_wait 不会返回这个事件的 fd
2.
struct timeval timeout;
timeout.tv_sec = 10;
timeout.tv_usec = 0;
setsockopt(client_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout);
没用,这是阻塞超时,recv()用的。非阻塞会立即返回。
这种连接浪费了茅坑资源,不知道有什么解决方法。设置 accept 后 10s不拉屎就断开。
阻塞情况下很好解决,但是非阻塞暂时没想到好办法。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部