我正在使用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