c# - 使用 C# 在 NAT 后面实现点对点

标签 c# .net p2p

我有一个一般性问题,可能已在此处某处得到解答,但使用搜索效率不高。所以,我会重新提问,如果有相关主题,请指出我的位置。谢谢。

所以,总体思路是: 我们有两个 .NET 编写的客户端,它们希望在不通过服务器路由整个流量的情况下相互交谈。更重要的是,没有必要让两个客户端都基于 .NET,但在任何情况下都会有一个(另一个可以是 Objective-C、Unix 上的 C++ 等)。

思路是:

  1. 第一个客户端建立与某个服务器的连接,因此 NAT 记住客户端位于地址 10.0.0.1:1234,服务器位于地址 70.0.0.7:4567。因此,当 70.0.0.7 将数据包发送回 NAT 时,NAT 将知道如何将其伪装成客户端。
  2. 第二个客户端建立到同一服务器的连接,因此第二个 NAT 还记得地址为 192.168.0.1:19234 的内部客户端连接到地址为 70.0.0.7:7654 的服务器,并且也能够接受返回的数据包192.168.0.1:19234
  3. 现在我们需要建立从 10.0.0.1:1234 到 192.168.0.1:19234 的连接。

两个 c# 客户端都可以知道彼此的端点(假设服务器保留 NATted 地址,它们是:Client1 - 111.0.0.1:1111 和 Client2 - 222.0.0.2:2222)。 必要的是 - 客户端 1 无需调用 Socket.Connect 即可直接将数据包发送到 222.0.0.2:2222,客户端 2 也无需调用 Socket.Connect 即可将数据包发送到 111.0.0.1:1111。

这是否可以只使用 .NET 而不使用任何特殊的库,只使用标准套接字等?

最佳答案

听起来您想做类似于 UDP hole punching 的事情

关于c# - 使用 C# 在 NAT 后面实现点对点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6676090/

相关文章:

c# - 重置 Visual Studio 的实验实例

.net - 具有动态内容区域的 XSLT 布局

c# - 从文件中读取速度不够快,我该如何加快速度?

networking - 选择多播 IP 地址

java - java中的p2p音频 session 和桌面共享

android - 如何为游戏设置 android 点对点网络?

c# - 使用循环的 ComboBox 项目

c# - 在 ASP.NET MVC 中使用参数在另一个 View 中重用一个 View

c# - 动态、对象、变量

.net - 导出 .NET 中的圈复杂度