我已經使用Boost C++實現了一個P2P應用程序。因爲你不知道UDP不保證數據包順序,甚至數據包傳輸,所以我想到:UDP數據包安排
將所有收到的UDP請求包中的一個請求放在一個鏈表中並正確排列,這樣序列和丟失的數據包可以以一種可靠的方式進行識別。鏈接列表使用struct來完成。 或
我認爲把它放在一個向量中,並將數據包安排在一個單獨的線程中。
哪一個是最好的方法?或者你會有另一種最佳的方法,而不是窗口滑動。
我已經使用Boost C++實現了一個P2P應用程序。因爲你不知道UDP不保證數據包順序,甚至數據包傳輸,所以我想到:UDP數據包安排
將所有收到的UDP請求包中的一個請求放在一個鏈表中並正確排列,這樣序列和丟失的數據包可以以一種可靠的方式進行識別。鏈接列表使用struct來完成。 或
我認爲把它放在一個向量中,並將數據包安排在一個單獨的線程中。
哪一個是最好的方法?或者你會有另一種最佳的方法,而不是窗口滑動。
而不是實現自己的容器或排序,爲什麼不使用標準庫中已有的東西?
例如,您可以使用std::map
,序列號作爲關鍵字。它會自動按鍵排序。
或者您可以使用std::priority_queue
與您自己的比較功能來檢查序列號。
你也應該看看UPnP NAT traversal。
這是個不錯的選擇。我試過後接受它作爲答案。謝謝。 – Navin 2012-08-08 06:48:58
爲確保正確的順序並檢測丟失的數據包或重複項,您必須使用順序號或類似的方法。當您將數據包放入發送端的鏈接列表中時,如何檢查接收端的正確順序?有關檢測丟失和亂序數據包的示例解決方案,請參閱TCP協議(儘管如此,它還是做了一些更多的工作)。
通常在丟包或重排序可以接受時使用UDP。如果你想確保這兩個屬性即使是UDP,你也必須自己做一些工作。
爲什麼不只是使用TCP? – Dani 2012-08-08 05:23:33
@dani TCP洞打孔不適用於所有的NAT。所以使用UDP我馬上安全。 – Navin 2012-08-08 05:25:30
以及UDP如何解決這個問題? – Dani 2012-08-08 05:28:31