【问题标题】:C# How to send string via UDP without Port Forwarding?C#如何在没有端口转发的情况下通过UDP发送字符串?
【发布时间】:2017-11-01 02:14:00
【问题描述】:

我需要类似的东西:


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);

监听器在 PORT: 11000 的 IP 上运行,但我不想在我的路由器中进行端口转发(因为我想发布这个应用程序)。

那么,问题来了:如何在没有端口转发的情况下通过 UDP 发送字符串?

【问题讨论】:

  • 据我所知,如果没有中间的服务器,两个客户端都可以连接,并且至少要依赖从一个到另一个的消息,这是无法完成的。
  • 所以如果我想在没有服务器的情况下将某些东西发送到带有路由器的 IP,我必须进行端口转发?
  • 仅端口转发或 udp 打孔或 stun 服务器
  • 看看这个问题的答案中的资源,它会比我解释得更好。 stackoverflow.com/questions/575448/…
  • 先谢谢了,我会读的。 UDP打孔怎么样?这是什么以及它是如何工作的?

标签: c# udp


【解决方案1】:

您可以使用NAT hole punching,不需要手动配置端口转发。这是很简单的技术。请注意,远程端点(接收方)也应该实现它,而不仅仅是发送方。

在最简单的情况下,它的工作原理是:

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

请注意sender 不在 NAT 后面。

senderIP:portXreceiverIP:portY 打一个洞: sender 绑定到portX 并等待来自receiver 的通信初始化。 receiver 绑定到portY 并向senderIP:portX 发送一个虚拟数据包。 sender 从包中获取receiverIP(实际上是它的路由器IP)和portY,现在将有意义的数据发送到这个地址。 NAT 记得与senderIP:portX 的通信是从receivers 本地IP 和portY 进行的,因此来自senderIP:portX 到路由器portY 的所有数据将被重定向到receivers 本地IP。

对于senderreceiver 都在 NAT 之后的情况,您需要一个集合点服务器,有关详细信息,请查看链接。

【讨论】:

  • 好的,告诉我这很容易,但不管你是否这样做,我仍然不知道如何实现它sad。有什么可以帮助我的代码吗?
  • 你到底有什么不明白的?您可以轻松地搜索几个 C# 实现,例如stackoverflow.com/questions/9140450/…, stackoverflow.com/a/12229756/453271
  • 感谢您的帮助,尽管我找到了另一种方法。 C# 以编程方式进行端口转发。
猜你喜欢
  • 1970-01-01
  • 2018-03-05
  • 2014-08-24
  • 2014-10-14
  • 2019-03-04
  • 2019-10-04
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
相关资源
最近更新 更多