2011-09-07 90 views
2

假設我有一臺服務器和兩臺連接到它的客戶端。 (通過TCP,但它並不重要)兩臺電腦之間沒有開放端口的通信,使用第三臺計算機來建立連接

我的目標是讓這兩個客戶端之間的直接連接。例如,允許兩個玩家直接進行語音聯繫,或者可以安裝任何其他不需要服務器交互的客戶端插件(例如在兩者之間玩某種隨機遊戲)。服務器可以在那裏幫助建立連接。

從duskwuff的回答,我有幾條線索:

http://en.wikipedia.org/wiki/STUN描述的算法來做到這一點,並
http://en.wikipedia.org/wiki/UDP_hole_punching

從這些,我得到了更多的線索:

http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html
http://nutss.gforge.cis.cornell.edu/stunt.php - 一個可能的STUN實現,使用TCP

隨着時間的推移,我肯定可以爲我的計劃制定一些計劃。現在我使用C++和TCP(Qt套接字或Boost套接字),但是如果需要的話,我不介意在C中做UDP並封裝它。

賞金是有與++的C和C,可能會給提示,使這更容易,通過鏈接到示例程序,更新庫,或任何其他有用的信息,任何有經驗的程序員。有記錄的靈活的工作C++ TCP實現將是最好的,但我會拿我得到的!

+1

臨時端口被用於向一個**知名的服務端口到服務器的請求響應* *(即HTTP,FTP等)。這樣服務器衆所周知的服務端口在響應請求時不會被阻塞,並且可以接受新的連接。例如,當您打開FTP連接時,初始請求會通過端口20,服務器接受連接請求並啓動一個進程以在另一個端口(臨時端口)上使用該會話。如果所有會話都通過同一個端口,則一次只能有一個會話保持連接。 – Xint0

+2

@ Xint0:這不太準確。 「臨時端口」根本不涉及HTTP。連接由本地ip,本地端口,遠程ip和遠程端口的唯一元組標識。只要遠程IP或遠程端口對於任何給定的一對不同的連接都不同,就可以在單個本地IP和端口上安裝許多可以處理的連接。 –

+0

@R ..當我寫HTTP時,我指的是HTTP服務器衆所周知的服務端口號80。 HTTP是應用層的協議。臨時端口用於傳輸層(TCP,UDP等) – Xint0

回答

3

在NAT衝壓TCP孔有時/經常可能的(它取決於NAT行爲)。這不是一個簡單的學習內容,但請閱讀實用JXTA II(可在Scribd上在線獲得)中有關NAT穿越的相應章節,以瞭解要解決的問題的性質。

然後,閱讀this。它來自那個寫這個的人:http://nutss.gforge.cis.cornell.edu/stunt.php(你的問題中的一個鏈接)。

我不是C/C++專家,但要解決的問題不是語言特定的。只要你有從你的代碼庫訪問TCP,就足夠了。請記住,實現UDP遍歷比TCP更容易。

希望這些提示幫助。

收錄人:我不知道該解決方案的C/C++實現。 Cornell鏈接中提到的代碼在作者確認的情況下不可用。我試圖自己復活,但他讓我知道它完全是爲了研究目的而調整的,而且遠沒有準備好。

3

我不知道有什麼方法可以可靠地通過防火牆的TCP衝,但有UDP通信類似的方法,這是相當有據可查:

+0

UDP穿孔是一種在使用網絡地址轉換器的專用網絡中的Internet主機之間建立雙向UDP連接的方法。該技術不適用於所有場景或所有類型的NAT,因爲NAT運行特性不是標準化的。 - 當場!我會等一下看看其他的迴應 – coyotte508

0

臨時端口不會神奇地消除通過服務器中繼的需要,因爲他們是唯一有效d通過一個着名的服務港開啓會議的生活。基本上,臨時端口取決於服務器會話。

您將需要使用服務器到兩個客戶端之間的通信進行中繼,也就是充當代理服務器。一種選擇是通過SSH代理服務器設置SSH隧道,並增加安全性。

不過這並不能保證防火牆不會阻止連接。這取決於防火牆類型和配置。充當防火牆的大多數住宅路由器默認阻止所有傳入連接。這通常很好,因爲防火牆後面的計算機大多數時間只作爲客戶端,它們啓動與外部的連接。而且這種設置有所不同,因爲有些限制只啓動連接到衆所周知的服務端口,如HTTP,HTTPS,FTP,SFTP,SSH等,並且如果您的代理服務器使用非知名服務端口,則連接將是受阻。

但防火牆可以設置爲阻止傳出流量也,這是最常見的企業網絡,甚至不容許通過代理服務器的Web服務器和路由都直接連接,以控制資源的使用。

您還可以研究使用UPnP動態打開端口。

+0

謝謝,它似乎短暫的端口不工作。雖然我不知道如何處理臨時端口,但如果服務器會話建立或延續不是由操作系統直接管理,而是由低級代碼管理的,那麼希望找到一個允許調整的庫。無論如何,duskwuff的帖子證明了它可能在UDP中,所以確實有辦法做到這一點,即使我需要更多地考慮它,也許它不使用臨時端口。 – coyotte508

1

您正在尋找的NAT打孔會合服務器:即公開訪問(不落後NAT /防火牆或他們正確配置)的服務器,以幫助落後NAT /防火牆的計算機建立對等網絡連接。

UDP在NAT打孔中比較流行,因爲它提供比TCP更好的結果。 UDP NAT穿孔的清晰和信息性描述可見here

如果您需要可靠的通信,可以使用可靠的協議通過UDP:

  1. SCTPlibraries) - 標準化的一個,或
  2. 的許多自定義協議之一,例如RakNet(我用的這個庫,這是相當成熟的,功能豐富,具有NAT衝壓實現),Enetmany others (Q8)
相關問題