Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UDP打孔-无法到达目标_C#_Udp_P2p - Fatal编程技术网

C# UDP打孔-无法到达目标

C# UDP打孔-无法到达目标,c#,udp,p2p,C#,Udp,P2p,我试图使用UDP打孔方法建立p2p连接,但我总是得到目的地不可到达状态的ICMP数据包 首先,创建了到服务器的UDP连接: send = new IPEndPoint(IPAddress.Any, 0); server = new UdpClient(send); server.AllowNatTraversal(true); 没有任何直接连接(没有ip,没有端口,只有随机端口上的端点) 我使用directserver向服务器发送一些数据包。在服

我试图使用UDP打孔方法建立p2p连接,但我总是得到目的地不可到达状态的ICMP数据包

首先,创建了到服务器的UDP连接:

        send = new IPEndPoint(IPAddress.Any, 0);
        server = new UdpClient(send);
        server.AllowNatTraversal(true);
没有任何直接连接(没有ip,没有端口,只有随机端口上的端点)

我使用direct
server向服务器发送一些数据包。在服务器的ip和端口上发送([…],…],serverip,serverport)
,并获取关于另一个对等方的信息(远程ip,用于连接到服务器的端口)

现在,我正在尝试通过使用服务器连接在对等方的IP:端口上发送简单的UDP数据包来打孔(但同样使用direct
server.send([…],…]、peerip、peerport)
)。我知道第一个数据包总是被丢弃的,所以我以100毫秒的间隔发送50个数据包,而远程对等方也做同样的事情

如果我理解UDP打孔方法,从第一个对等方(A)发送数据包会在A的NAT中打开NAT记录,并且由于NAT中没有记录,它会被B的NAT丢弃。因此,当B向A发送数据包时,A的NAT中有一条记录,该记录是用第一个数据包(对于B)创建的,数据包应该由B接收。将创建B的NAT中的NAT记录A应成功地将另一个数据包发送到B

附言:测试成功了 -在第二个虚拟机上使用VPN


p.p.S.:我正在虚拟盒中使用虚拟化窗口。

您应该从两个端点获取网络捕获跟踪,并研究结果。请密切注意各方面的端口号,因为端口号和IP地址可能会被重新映射

很难推断你在问什么。如果收到ICMP错误,则可能是NAT或端点未准备好接收UDP数据包。再重复几次打孔测试可能会解决这个问题

我怀疑您认为远程对等机正在侦听的端口号映射与您认为的不同。如果您使用的是对称NAT,则会出现这种情况,这在虚拟机上使用VPN是非常可能的