2017-05-31 110 views
0

我需要這個東西呈三角:C#如何通過UDP發送字符串沒有端口轉發?


 var client = new UdpClient(); 
     IPEndPoint ep = new IPEndPoint(IPAddress.Parse("23.114.44.195"), 11000); 
     client.Connect(ep); 

     byte[] data = Encoding.ASCII.GetBytes("test"); 
     client.Send(data, data.Length); 

的聽衆對IP在端口上運行:11000,但我不希望端口轉發在我的路由器(因爲我想發佈這個應用程序)。

所以,這裏是一個問題:如何通過UDP發送字符串沒有端口轉發?

+0

據我所知,如果沒有中間的服務器,兩個客戶端都可以連接並至少依靠從另一個到另一個的消息,則無法完成此任務。 –

+0

所以如果我想發送一個沒有服務器的東西到一個帶有路由器的IP,我必須向前移動? –

+0

只有端口轉發或udp打孔或擊暈服務器 –

回答

0

您可以使用NAT hole punching,它不需要手動端口轉發配置。這是非常簡單的技術。請注意,遠程端點(接收器)也應該實現它,而不僅僅是發送者。

在最簡單的情況下,它的工作原理爲:

[sender] <-> |internet| <-> [remote router with NAT] <-> [receiver] 

請注意sender不是在NAT後面。

要打孔從senderIP:portX孔以receiverIP:portYsender結合portX並且等待來自receiver通信初始化。 receiver綁定到portY併發送一個虛擬數據包到senderIP:portXsender從包中獲取receiverIP(實際上是其路由器IP)和portY,現在將有意義的數據發送到此地址。 NAT記住與senderIP:portX的通信從receiver的本地IP和portY開始,因此所有來自senderIP:portX到路由器的portY的數據將被重定向到receiver的本地IP。

對於senderreceiver位於NAT後面的情況,您需要一個集合點服務器,詳細信息請查看鏈接。

+0

好吧,告訴我這很容易,但無論你做不做,我仍然不知道如何實現它*悲傷*。任何代碼可以幫助我? –

+0

你到底明白了什麼?您可以輕鬆地在谷歌上實現一些C#實現,例如https://stackoverflow.com/questions/9140450/udp-hole-punching-implementation,https://stackoverflow.com/a/12229756/453271 –

+0

感謝您的幫助,儘管我找到了另一種方式。 C#以編程方式進行端口轉發。 –