我正在使用epoll进行网络编程。这似乎工作正常。我想添加一个超时函数,所以如果客户端长时间没有发送任何东西,那么它只会断开客户端。如何实现epoll超时?
我该怎么做?我知道我可以设置在epoll_wait超时,但是,这不是个别插座...提前
谢谢...
我正在使用epoll进行网络编程。这似乎工作正常。我想添加一个超时函数,所以如果客户端长时间没有发送任何东西,那么它只会断开客户端。如何实现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
。
我很安静不知道你的意思是“添加它epoll集”..我认为每个客户端将有自己的超时,因为他们最后一次连接是不同的..所以,如果我添加一个timerfd到我的epoll集,然后并不是所有的客户端都有相同的超时时间吗? – codereviewanskquestions
根本没有必要使用timerfd(),因为您可以为timeout参数指定一个适当的值。 – MarkR
只要使用了libevent *或同级;这将节省实施自己的队列和检查超时的工作量。它也可能使你更容易使用epoll,并且作为一个附加的好处是可移植性更强(比如说你想在FreeBSD上运行你的应用程序,它没有epoll,但有一些概念上类似于kqueue)
*其他类似库可用。
感谢您的回答。你能告诉我一个这样的骨架代码吗?很难按照你所说的..预先感谢.. – codereviewanskquestions
@LCYSoft:基本思想是使用时间,直到第一个客户端到期作为'epoll_wait()'超时。查看更新。 – caf
是的,这是一个很好的做法。 – MarkR