假設我有一臺服務器和兩臺連接到它的客戶端。 (通過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實現將是最好的,但我會拿我得到的!
臨時端口被用於向一個**知名的服務端口到服務器的請求響應* *(即HTTP,FTP等)。這樣服務器衆所周知的服務端口在響應請求時不會被阻塞,並且可以接受新的連接。例如,當您打開FTP連接時,初始請求會通過端口20,服務器接受連接請求並啓動一個進程以在另一個端口(臨時端口)上使用該會話。如果所有會話都通過同一個端口,則一次只能有一個會話保持連接。 – Xint0
@ Xint0:這不太準確。 「臨時端口」根本不涉及HTTP。連接由本地ip,本地端口,遠程ip和遠程端口的唯一元組標識。只要遠程IP或遠程端口對於任何給定的一對不同的連接都不同,就可以在單個本地IP和端口上安裝許多可以處理的連接。 –
@R ..當我寫HTTP時,我指的是HTTP服務器衆所周知的服務端口號80。 HTTP是應用層的協議。臨時端口用於傳輸層(TCP,UDP等) – Xint0