應用背景:
epoll模型是當前Linux網絡編程的主流模型,可以高效解決多個事件並發的問題。在進行網絡編程時,往往要對每一個發出的數據包進行ACK確認,若在指定的時間內沒有收到ACK,則需要重傳或者丟棄該數據包。那麼如果在epoll模型中實現該功能呢?
先來看看傳統的做法:程序維護一個“已發出但是沒收到ACK”的數據包記錄R,記錄包括數據包內容、數據包發送的時間戳t以及超時時間T。當需要進行數據包發送時,在發出數據包的同時把該數據包加入記錄R,接下來程序繼續執行。在這個方法中,程序需要通過一種手段定時檢測當前時間now是否大於記錄R中的每一個數據包的t+T,若大於,則說明數據包接收ACK超時,可以通過多線程技術或者在程序主循環中每循環一次檢測一次。
現在的問題是:一般的epoll模型,程序都會阻塞在epoll_wait調用上,程序沒有辦法循環檢測記錄R,有人會說,epoll_wait不是有超時時間麼?的確,但是這個超時只能針對一個數據包的情況,試想一下,若程序當前依次發出了10個數據包,各自的超時時間分別為3秒、5秒、2秒等等,那麼epoll_wait的超時時間應該設置多長呢?答案是沒有辦法。因為前面的數據包萬一設置的epoll_wait超時時間比較長,後面來了一個超時時間短的,由於epoll_Wait的阻塞,就會錯失後面超時時間短的數據包的重發機會。
--------------------------------------分割線 --------------------------------------