我想在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.但它无论如何都不起作用。
示例:
答案 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看到的公共端点不同,即使对等端使用相同的私有端点也是如此。