3

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

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

提前致谢...

4

3 回答 3

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);
}
于 2011-07-06T07:13:32.013 回答
2

您可以创建一个循环timerfd并将其添加到您的 epoll 集中。它会以您喜欢的频率唤醒您,此时您可以检查所有客户端连接并删除您认为过时的连接。

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

于 2011-07-06T01:11:21.203 回答
-1

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

* 其他类似的库可用。

于 2011-07-06T11:39:53.753 回答