2011-07-06 174 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)

*其他類似庫可用。