NAT后面的UDP P2P连接

时间:2013-01-17 04:06:59

标签: c# udp nat udpclient

我想在NAT后面的2个客户端之间建立P2P连接。我研究了使其工作的方法,我想尝试“UDP打孔方法”。

因此...

我用PHP制作了一个服务器,可以根据需要向客户端发送连接细节(如远程IP,远程端口)。

源代码示例如下:http://pastebin.com/FdiKMSFq

接下来,我在C#中创建了一个Client,它永久地连接到服务器并向他询问另一个客户端信息。客户端收到另一个客户端的远程IP和远程端口(用于与服务器连接)并尝试连接。

此处的完整源代码:http://pastebin.com/VUJyZivW

第一步(连接并询问详细信息)是可以的,但是当客户端(A)连接到另一个客户端(B)并发送一些数据(A-> B)时,客户端B不接收任何数据。 / p>

我将两个IPEndPoints设置为端口2000.但它无论如何都不起作用。

示例:

  • A:192.168.1.11:2000,服务器获取32.14.15.16:56666
  • B:192.168.1.5:2000,服务器获得32.99.15.16:56699
  • A尝试连接32.99.15.16:56699并发送一些数据

1 个答案:

答案 0 :(得分:1)

查看您的示例,B的NAT将丢弃发往其公共端点(地址和端口对)的数据包。这是因为B的NAT将此视为未经请求的请求。

为了让B的NAT从A通过数据包,它必须认为B先前与A通信,因此考虑请求请求。 NAT保留一个内部表来跟踪它。

建立连接的方法是让B向A的公共端点(32.14.15.16:56666)发送数据包。这样做会“打击”B的NAT中的一个洞。在你的例子中,A已经通过向B发送流量来“打孔”。

请记住,只有当至少一个NAT始终将私有源端点转换为公共源端点(无论目标地址如何)时,这才有效。这是因为否则您的服务器看到的公共端点可能与P2P对等端的NAT看到的公共端点不同,即使对等端使用相同的私有端点也是如此。