2014-07-08 109 views
1

我一直在尋找一個簡單的UDP C++庫,可以在一段時間內提供可靠性。我剛剛遇到了ENet,看起來很完美,除了在文檔中找不到任何對NAT打孔的支持。互聯網似乎有幾個人正在討論這個問題,但我還沒有找到明確的答案,以確定它是否可行。使用ENet進行NAT打孔

我已經有第三方服務器配置爲向客戶端分發外部ips &端口。

如果有可能,有人可以給出一些僞代碼/步驟描述過程?

回答

2

我想通了。下面是我所做的:

  1. 當前客戶端創建主機
  2. 連接到第三方服務器
  3. 當其他客戶端連接到第三方服務器,它發出的其他客戶信息,以每個客戶
  4. 在接收到對等體地址後,每個對等體嘗試連接到用於連接到服務器的同一個套接字上的另一個對等體,並開始將數據包發送到該地址。這最初是我的問題。我只送了幾包,而且很容易丟失。連接只能工作一半時間。我結束了產生一個發送數據包的線程,直到連接成功或失敗。
  5. 連接應該被送到
+0

偉大的思想! – JSON

-1

UDP可能會丟棄數據包,並且它可能會亂序發送數據包。訂購數據包是微不足道的。 但是,如果一個數據包已被丟棄,則無法恢復它。但是,許多使用UDP的系統會爲您提供重複數據的另一個流。在這種情況下,您可以簡單地使用輔助流創建備份,然後更新檢查第一個流中丟棄的包是否在第二個流中可用。

+0

了幾包後建立,這將有可能他爲什麼選擇[硅谷動力](http://enet.bespin.org/index.html)... – JSON

+0

除非這兩個UDP 「流」找到了使用兩條不同路由的方法,它們可能會經歷同樣的數據包丟失。這是因爲來自流1和流2的數據包[x]將在大約相同的時間通過相同的路由器。如果沿途的路由器正在轉儲數據包,則可能會從兩個數據流中丟棄數據包[x]。實際上,它可能很容易從兩個數據流中丟棄數據包[x-5]到數據包[x + 5]。這個範圍內的一些數據包可能會使其來自一個數據流而不是其他數據包,但不足以指望兩個數據流之間到達的所有數據包。 – JSON