UDP打孔到期[关闭]

Posted

技术标签:

【中文标题】UDP打孔到期[关闭]【英文标题】:UDP hole punching expires [closed] 【发布时间】:2014-01-19 15:50:14 【问题描述】:

更新

原来问题与 NAT 和 UDP 打洞无关。 所以我创建了一个new Q.

我已经使用以下方法实现了 UDP 打孔:

位于已知端口的已知服务器(无 NAT)正在处理传入的 UDP。

NAT 后面的客户端向服务器发送数据报,之后服务器通过向该客户端发送对等方的地址进行响应。

客户端现在开始通过同一个套接字使用 UDP 与对等方通信(但当然是到不同的地址。)

如果一段时间后,客户端停止与对等方的通信,并再次向服务器发送另一个数据报,则该数据报不会到达(除非我通过从服务器向客户端发送 keepalive 数据报来保持通道打开。)

我的问题: 怎么从serverclient之间的数据报切换到peerclient之间的数据报可以, 但是一旦我切换回来并且客户端再次发送到服务器,它们就没有到达?

【问题讨论】:

【参考方案1】:

我怀疑这种行为特定于您的 NAT。听起来端口映射逻辑有问题。您可能会在网络上放置一个不同的 NAT 框并看到不同的行为。

我的建议是始终为每个对等会话使用不同的本地端口和套接字。因此,假设您在第一个会话中使用端口 2000 与服务器和对等方通信,那么下一个会话应该使用完全不同的本地端口。那么 NAT 与先前端口的任何问题都不会影响这个新套接字。

一般来说,如果你想在一对主机之间保持一个 UDP 通道打开,你应该至少每 45 秒有一个数据包流动。

【讨论】:

谢谢。本地端口是指临时端口?请注意,我从不选择此端口。开始通信时,客户端将一个数据报发送到服务器的已知端口(每个会话无法更改)。然后服务器在临时端口上看到客户端。要获得一个新的,我关闭套接字,创建一个新的,然后再次发送? 这很奇怪:关闭套接字并创建一个新的不起作用。重新启动应用程序使我可以再次访问服务器。但关闭套接字、创建一个新套接字并发送数据报不会。 您是否在客户端和服务器端都进行了网络跟踪,以查看数据包是否真正被发送和接收? 是的,现在使用 iptraf,并且还将客户端+服务器移动到我的 LAN,因此不再涉及 NAT。还是同样的问题,所以我应该关闭这个Q,并创建一个新的,因为它与打孔无关。我的路由器是 Apple Airport Extreme,所以不是便宜的烂路由器。 您没有发布任何代码,但从您现在所说的情况来看,这听起来更像是一个套接字编码问题。您应该在后续帖子中发布您的代码。

以上是关于UDP打孔到期[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

UDP打孔无法外接

udp打孔后发送文件

UDP打孔可能吗?

UDP 打孔 - 无法到达目的地

iOS 上的 UDP 打孔

UDP 打孔 (c++/winsock)