客戶端網絡socket判定超時(TCP)

網絡socket是整個傳輸層的基礎,幾乎所有的應用層協議都要經過該層來傳輸。下面以基於TCP的客戶端在阻塞與非阻塞兩個模式下的超時判斷。

一、阻塞socket
採用setsockopt。
SO_SNDTIMEO:限制send超時。

SO_RCVTIMEO:限制recv超時

對於connect的超時控制,還需要首先將socket轉爲非阻塞模型,處理完畢後(見下面二),再轉換爲阻塞socket,進行發送與接收的超時控制。

二、非阻塞socket
1、採用自定義計算時間的方案:

在while循環以前計算起始時間;在循環中,connect、send、recv每進行一次,計算經過了多長時間。最終,可以確定超時。

在實際中,非阻塞的socket採用自定義時間的方案時候,應該再while循環中,除了有需要的傳輸函數(connect、send、recv),還要sleep一下。sleep時間長了,會導致接收不及時;sleep時間長了,會導致CPU資源浪費!所以,應該變被動輪詢爲主動通知,這就要用select模型!

2、採用select模型:
首先,通過FD系列函數(FD_ZERO、FD_SET、FD_ISSET 、FD_CLR)來創建socket集合。

其次,在while中,執行select函數,該函數需要設置讀取、寫入、異常的時間。在該事件內,如果沒有接收、發送、異常等事件發生,則進入下一輪處理;否則,判定事件是在哪個socket發生的,並做出相應處理。

三、總結

客戶端socket模型超時方案中,最好的就是阻塞用setsockopt,非阻塞用select!實際客戶端中,非阻塞socket比阻塞socket應用更廣泛。進一步拓展,客戶端socket最優方案就是非阻塞+線程+select!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章