我正在使用epoll进行网络编程。好像工作正常。我想添加一个超时功能,所以如果客户端长时间没有发送任何东西,那么它只会断开客户端。
我该怎么做?我知道我可以在epoll_wait中设置超时,但这不适用于单个套接字...
提前致谢...
答案 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)
*其他类似的库可供使用。