簡體   English   中英

如何在C中為多個UDP數據包設置超時?

[英]How to setup timeout for multiple UDP packets in C?

我正在編寫UDP服務器/客戶端程序,其中服務器通過具有固定窗口大小的單個端口將數據包發送到客戶端,客戶端將為收到的每個數據包發送回ack數據包。 現在,我希望服務器處理丟失的數據包情況。 通過一些谷歌搜索,似乎我應該使用ALARMSELECT 我當然不想發送一個數據包,等待ack或超時,然后再發送另一個數據包,但是SELECT將在超時期間阻止調用函數,所以我認為這不好。 ALARM也不好,因為一個程序只能有一個ALARM 那么,有什么方法可以讓我繼續跟蹤服務器發送的多個數據包的超時時間嗎?

以下是我首先想到的。

打開套接字以非阻塞模式偵聽。 不阻塞是關鍵。 如果select表示有東西存在,但事件恰好對准,則可能是在其他地方處理的錯誤警報,並且阻塞了不來的東西很麻煩。

對於每個發送的數據包,請保留一個鏈接列表,該列表按超時時間排序。

收到響應后,從鏈接列表中刪除。

使用select等待下一個傳入的數據包,並在合理的時間內超時。 我傾向於最多使用幾秒鍾,即使看起來更長的超時時間可以彌補任何罕見的“以防萬一”情況也是合理的。 您在此處阻止的是傳入數據包,但不要超過下次超時。

選擇返回后,如果請求可用,則accept()並處理請求。

在循環處理任何新的超時之前,請適當調整鏈接列表。

快速的網絡搜索可在http://www.lowtek.com/sockets/select.html上找到更多詳細信息。

select()將與recvmsg()阻止的方式相同。 它是超時的替代品。 您還可以使用SO_RCVTIMEO選項來設置讀取超時,如果平台支持,則該操作更簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM