C#如何通过UDP发送字符串没有端口转发?

C#如何通过UDP发送字符串没有端口转发?

问题描述:

我需要这个东西呈三角: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打孔或击晕服务器 –

您可以使用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#以编程方式进行端口转发。 –