我正在使用 epoll 进行网络编程。似乎工作正常。我想添加一个超时功能,所以如果客户端很长一段时间没有发送任何东西,那么它只会断开客户端。
我该怎么做呢?我知道我可以在 epoll_wait 中设置超时,但这不适用于单个套接字......
提前致谢...
我正在使用 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);
}
您可以创建一个循环timerfd
并将其添加到您的 epoll 集中。它会以您喜欢的频率唤醒您,此时您可以检查所有客户端连接并删除您认为过时的连接。
如果您的 Linux 太旧而无法支持 timerfd,您可以尝试使用较旧的timer_create
.
只需使用 libevent* 或类似的;这将节省实现您自己的队列和检查超时的工作量。它还可能使您更容易使用 epoll,并且作为一个额外的好处是更便携(假设您想在 FreeBSD 上运行您的应用程序,它没有 epoll 但在概念上具有类似的称为 kqueue 的东西)
* 其他类似的库可用。