我正在寫一個UDP服務器/客戶端程序,服務器通過一個固定窗口大小的單個端口向客戶端發送數據包,並且客戶端將爲每個收到的數據包發回ack數據包。現在我想讓服務器處理丟包的情況。通過一些谷歌搜索,似乎我應該使用ALARM
或SELECT
。我當然不希望發送一個數據包,等待確認或超時,然後發送另一個數據包,但SELECT
會在超時期間阻塞調用功能,所以我認爲它不好。 ALARM
也不好,因爲一個程序只能有一個ALARM
。那麼有沒有什麼辦法可以讓我跟蹤多個數據包服務器發送的超時?如何在C中爲多個UDP數據包設置超時?
1
A
回答
1
以下是我首先想到的。
打開套接字以非阻塞模式進行偵聽。非阻塞是關鍵。如果select表示有東西存在,但事件對齊恰到好處,那麼可能是在別處處理的虛假警報,阻止未到來的事情是麻煩。
對於每個發送的數據包都保留一個按升序超時次序排序的鏈表。
收到回覆後,請從鏈接列表中刪除。
使用select可以等待下一個傳入的數據包,並有合理的超時時間。我傾向於使用最多幾秒鐘,即使看起來更長的時間是合理的以涵蓋任何罕見的「萬一」情況。你在這裏阻塞的是傳入的數據包,但不會超出下次超時。
一旦select返回,如果請求可用,則accept()並處理請求。
在迭代循環處理任何新的超時之前,根據需要調整鏈接列表。
快速網絡搜索在http://www.lowtek.com/sockets/select.html上顯示了更多詳細信息。
+0
accept()不用於UDP。 – EJP
0
select()將阻止recvmsg()塊的相同方式。它是一個暫停的替代品。您也可以使用SO_RCVTIMEO選項來設置讀取超時,如果您的平臺支持,讀取超時更簡單。
相關問題
- 1. 如何在Java中接收多個UDP數據報數據包?
- 2. 如何在actionscript 3中設置UDP數據包的TTL?
- 3. 丟失數據包超時(UDP)
- 4. Java-在接收UDP數據包時設置tiimeout函數java
- 5. 如何在scapy中多次發送一個udp數據包?
- 6. C#如何分割UDP數據包?
- 7. Birt - 如何設置數據源超時?
- 8. 取消多個超時設置爲ID
- 9. 如何爲Rollover設置超時函數
- 10. UDP套接字設置超時
- 11. 如何在Objective-C中爲gRPC請求設置超時?
- 12. 如何設置udp數據包的格式?
- 13. 二郎:如何設置或UDP數據包檢查TTL?
- 14. 如何在這個簡單的C shell中設置超時?
- 15. 如何在C中使用UDP監聽數據包?
- 16. 如何爲多個子進程設置超時
- 17. 超時設置爲一個PHP函數
- 18. 如何在Spring中爲多個數據源設置liquibase?
- 19. 如何在CodeIgniter中設置MongoDB數據庫連接超時?
- 20. 如何在webpy中設置數據庫超時?
- 21. 如何爲PhantomJS設置超時時間?
- 22. 在C發送UDP數據包#
- 23. C#:如何設置DNS解析超時?
- 24. 如何爲oracle設置django數據庫請求超時
- 25. Python:如何設置在SocketServer.TCPServer接收數據的超時時間
- 26. Java如何處理多個UDP數據包接收?
- 27. 如何在C#中設置超時時間
- 28. 在C++中設置ifstream超時?
- 29. 在C中設置TCP重傳超時
- 30. 設置爲接收多播數據包的IPv6 UDP套接字是否也能夠接收單播數據包?
由於您擔心丟失數據包,爲什麼不使用TCP?我的理解是,UDP最適合「間距和忘記」的情況,也就是說丟包的一些可以接受的地方*和*排序並不重要。如果丟失任何數據包是不可接受的,並且數據包必須「按順序」接收,則TCP會處理跟蹤,確認,重試和數據包排序。 –