如何实现epoll超时?

时间:2011-07-06 01:04:34

标签: linux networking epoll

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

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

提前致谢...

3 个答案:

答案 0 :(得分:9)

保留按剩余时间排序的套接字列表,直到超时为止(如果所有套接字的超时时间相同,则相当于按最后收到的消息的时间对它们进行排序)。每次拨打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);
}

答案 1 :(得分:2)

您可以创建定期timerfd并将其添加到您的epoll集中。无论你喜欢什么,它都会唤醒你,此时你可以检查你所有的客户端连接并丢弃那些你认为过时的连接。

如果您的Linux太旧而无法支持timerfd,您可以尝试使用较早的timer_create

答案 2 :(得分:-1)

只需使用libevent *或类似的;这将节省实现自己的队列和检查超时的工作量。它也可以使你对epoll的使用更容易,并且作为一个额外的好处是更便携(假设你想在FreeBSD上运行你的应用程序,它没有epoll,但有一些概念上类似的东西叫做kqueue)

*其他类似的库可供使用。

相关问题