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 也不会通知
网上找到两个方法:
epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
改为
epoll_wait(epoll_fd, events, MAX_EVENTS, 10);
没用,这是 epoll 事件超时,而不是连接超时。
epoll_wait 返回的是活跃事件,如果不发送任何数据,epoll_wait 不会返回这个事件的 fd
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不拉屎就断开。
阻塞情况下很好解决,但是非阻塞暂时没想到好办法。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.