2012-08-08 70 views
1

我已經使用Boost C++實現了一個P2P應用程序。因爲你不知道UDP不保證數據包順序,甚至數據包傳輸,所以我想到:UDP數據包安排

將所有收到的UDP請求包中的一個請求放在一個鏈表中並正確排列,這樣序列和丟失的數據包可以以一種可靠的方式進行識別。鏈接列表使用struct來完成。 或
我認爲把它放在一個向量中,並將數據包安排在一個單獨的線程中。

哪一個是最好的方法?或者你會有另一種最佳的方法,而不是窗口滑動。

+1

爲什麼不只是使用TCP? – Dani 2012-08-08 05:23:33

+0

@dani TCP洞打孔不適用於所有的NAT。所以使用UDP我馬上安全。 – Navin 2012-08-08 05:25:30

+0

以及UDP如何解決這個問題? – Dani 2012-08-08 05:28:31

回答

4

而不是實現自己的容器或排序,爲什麼不使用標準庫中已有的東西?

例如,您可以使用std::map,序列號作爲關鍵字。它會自動按鍵排序。

或者您可以使用std::priority_queue與您自己的比較功能來檢查序列號。

你也應該看看UPnP NAT traversal

+0

這是個不錯的選擇。我試過後接受它作爲答案。謝謝。 – Navin 2012-08-08 06:48:58

0

爲確保正確的順序並檢測丟失的數據包或重複項,您必須使用順序號或類似的方法。當您將數據包放入發送端的鏈接列表中時,如何檢查接收端的正確順序?有關檢測丟失和亂序數據包的示例解決方案,請參閱TCP協議(儘管如此,它還是做了一些更多的工作)。

通常在丟包或重排序可以接受時使用UDP。如果你想確保這兩個屬性即使是UDP,你也必須自己做一些工作。

+0

在接收端的實際鏈接列表中的序列號。如果鏈接列表標識序列順序不正確,它將詢問數據包,那是邏輯。無論如何,謝謝我想出了一種方法,我猜。反正 – Navin 2012-08-08 06:26:49

+0

,謝謝scai – Navin 2012-08-08 08:05:53