Sockets UDP打孔算法

Sockets UDP打孔算法,sockets,udp,hole-punching,Sockets,Udp,Hole Punching,有人能举一个UDP打孔的例子吗 实际上,我想写一个聊天程序,当人们知道对方的IP时,可以用它聊天。但这两台机器都将位于防火墙路由器的后面。所以,我需要打个洞来沟通 我想要一个这样的函数,在调用该函数时,会打一个洞,未来的通信将很容易进行-如果这不是太多要求的话:)简短回答:这不能可靠地完成 长答覆: “穿孔”是指触发路由器的自动NAT规则以允许入站流量。发送UDP数据包时,路由器(通常)会创建一个临时规则,将源地址和端口映射到目标地址和端口,反之亦然。从目标地址和端口(无其他)返回的UDP数据包

有人能举一个UDP打孔的例子吗

实际上,我想写一个聊天程序,当人们知道对方的IP时,可以用它聊天。但这两台机器都将位于防火墙路由器的后面。所以,我需要打个洞来沟通


我想要一个这样的函数,在调用该函数时,会打一个洞,未来的通信将很容易进行-如果这不是太多要求的话:)

简短回答:这不能可靠地完成

长答覆:

“穿孔”是指触发路由器的自动NAT规则以允许入站流量。发送UDP数据包时,路由器(通常)会创建一个临时规则,将源地址和端口映射到目标地址和端口,反之亦然。从目标地址和端口(无其他)返回的UDP数据包将传递到原始源地址和端口(无其他)。此规则将在几分钟不活动后超时

当两个端点都位于NAT或防火墙之后时,要使其正常工作,需要两个端点大约同时向对方发送数据包。这意味着双方都需要知道对方的公共IP地址和端口号,并需要通过其他方式相互通信

如果程序位于NAT后面,则无法直接确定其自己的公共IP地址(它只能看到其私有地址,如
192.168.x.x
)。但是,由于您假设相关人员知道彼此的IP地址,因此这些人员可以只键入对方的地址


但真正的问题是,程序也无法直接确定路由器在公共端使用的端口号。您的程序可能绑定到本地计算机上的12345,但路由器可以将其映射到公共端的几乎任何端口。(假设您的本地网络上的两台计算机都从端口12345发送,显然路由器必须将其中一台映射到不同的号码。)因此,即使您和人类可能知道您绑定的本地端口号,无法知道路由器将向世界显示什么端口号。

利德格伦的网络库内置了此功能。将库添加到应用程序后,您将实例化一个NetServer,让两个NetClient连接,并调用NetServer.introduct()


链接到Lidgren:

可能的重复:没有一个简单的函数可以直接调用来解决所有NAT遍历问题。有关NAT遍历和P2P的详细讨论,请参见上面的链接。Seth-您很好地概述了NAT遍历的问题,但您使它看起来似乎是一个不可能解决的问题。但实际上,STUN、TURN、ICE和可靠的信令服务的组合使P2P连接非常可靠。换一种说法——公共互联网上的服务器帮助节点直接连接。如果能够可靠地连接到第三方中继,那么问题基本上就不会出现@c、 adhityaa实际上并没有说直接沟通是一项要求,所以我应该问一下。此外,如果您放宽了可靠性要求,那么让两个对等点同时以每秒几次的间隔彼此发送数据报可能会在大部分时间内奏效。我习惯于处理公司防火墙,所以我可能对网络允许的内容过于悲观。