linux - 如何实现 epoll 超时?

标签 linux networking epoll

我正在使用 epoll 进行网络编程。看起来工作正常。我想添加一个超时功能,所以如果客户端长时间没有发送任何内容,那么它只会断开客户端。

我该怎么做?我知道我可以在 epoll_wait 中设置超时,但这不适用于单个套接字...

提前致谢...

最佳答案

保留一个按剩余时间排序的套接字列表,直到它们超时(如果所有套接字的超时时间都相同,那么这相当于按最后收到消息的时间对它们进行排序)。每次调用 epoll_wait() 时,选择剩余时间最短的套接字直到超时(它将位于列表的前面)。使用该时间作为 epoll_wait() 中的超时时间。

epoll_wait() 返回时,在处理完所有事件套接字后,遍历排序的套接字列表,修剪所有过期的套接字(将位于排序列表的开头)。


epoll_wait()时:

timeout = expirylist->expire_time - current_time();
n_events = epoll_wait(epfd, events, maxevents, timeout);

handle_events(events, n_events);

for (client = expirylist; client != NULL && client->expire_time < current_time(); client = client->expire_next)
{
    do_timeout(client);
}

关于linux - 如何实现 epoll 超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6590531/

相关文章:

linux - 配置 LVDS 显示时序的问题(rk3288 上的 linux)

linux - Bash - 从零开始的 Linux,cheching 库脚本

events - TCL类C10K事件服务器开发现状如何?

为事件驱动应用程序选择 IPC 解决方案

linux - 套接字能否在 EWOULDBLOCK 之后但在 epoll_wait 之前变得可写?

linux - tar.gz 和 tgz 是一回事吗?

linux - 脚本/基本/fixdep : No such file or directory

security - Node.js:将 repl 挂接到远程 Node 服务器

检查设备 "connected"/是否可用

java.net.SocketException : Not a multicast address 异常