使用C#在NAT后面点对点

时间:2011-07-13 08:25:43

标签: c# .net p2p

我有一个普遍的问题可能在这里得到了解答,但使用搜索效率不高。所以,我会重新讨论,如果有关于此的话,请指点我。感谢。

所以,一般的想法是: 我们有两个.NET编写的客户端,希望彼此通信,而无需通过服务器路由整个流量。更重要的是,两个客户端都不必是基于.NET的,但无论如何都是一个(另一个可以是Unix上的Objective-C,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的连接。
  4. 两个c#客户端都可以知道彼此的端点(假设服务器保留了NATted地址,它们是:Client1 - 111.0.0.1:1111和Client2 - 222.0.0.2:2222)。 有必要的是 - Client1能够在不调用Socket.Connect的情况下直接将数据包发送到222.0.0.2:2222,并且Client2也可以在不调用Socket.Connect的情况下将数据包发送到111.0.0.1:1111。

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

2 个答案:

答案 0 :(得分:3)

听起来你想做类似于UDP hole punching

的事情

答案 1 :(得分:1)