1

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

所以...

我用 PHP 制作了一个服务器,它可以按需向客户端发送连接详细信息(如远程 IP、远程端口)。

作为示例的源代码在这里: http: //pastebin.com/FdiKMSFq

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

完整的源代码在这里: http: //pastebin.com/VUJyZivW

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

我将两个 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 并发送一些数据
4

1 回答 1

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 看到的不同,即使对等点使用相同的私有端点也是如此。

于 2013-01-25T21:40:15.413 回答