我正在使用 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/