2011-07-06 177 views
3

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

我该怎么做?我知道我可以设置在epoll_wait超时,但是,这不是个别插座...提前

谢谢...

回答

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); 
} 
+0

感谢您的回答。你能告诉我一个这样的骨架代码吗?很难按照你所说的..预先感谢.. – codereviewanskquestions

+1

@LCYSoft:基本思想是使用时间,直到第一个客户端到期作为'epoll_wait()'超时。查看更新。 – caf

+0

是的,这是一个很好的做法。 – MarkR

2

您可以创建一个周期性timerfd并将其添加到您的epoll的设置。无论你喜欢什么,它都会唤醒你,在这一点上,你可以检查你所有的客户端连接,并删除你认为不合时宜的连接。

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

+0

我很安静不知道你的意思是“添加它epoll集”..我认为每个客户端将有自己的超时,因为他们最后一次连接是不同的..所以,如果我添加一个timerfd到我的epoll集,然后并不是所有的客户端都有相同的超时时间吗? – codereviewanskquestions

+0

根本没有必要使用timerfd(),因为您可以为timeout参数指定一个适当的值。 – MarkR

-1

只要使用了libevent *或同级;这将节省实施自己的队列和检查超时的工作量。它也可能使你更容易使用epoll,并且作为一个附加的好处是可移植性更强(比如说你想在FreeBSD上运行你的应用程序,它没有epoll,但有一些概念上类似于kqueue)

*其他类似库可用。