iOS 上的 UDP 打孔

Posted

技术标签:

【中文标题】iOS 上的 UDP 打孔【英文标题】:UDP Hole Punching on iOS 【发布时间】:2013-08-15 10:03:15 【问题描述】:

我已经建立了一个网络项目,通过打孔通过 LAN 或 WAN 进行通信。我正在为客户端使用 GCSAsyncUdpSocket。我有一个集合服务器,它的端口被转发,可以从所有传入连接访问。我的设置是这样的:

Client A connects to the server. 

Client B connects to the server. 

Server observes the IP address and Port used by both clients. 

Server tells Client A to communicate with public IP Address B and public Port B.

Server tells Client B to communicate with public IP Address A and public Port A.

Client A sends periodic data to Client B.

Client B sends periodic data to Client A. 

这有点奇怪。虽然客户端在同一个网络上,我们在两个网络上都尝试过,但没有任何效果。但是,如果设备连接到不同的网络(都与不同的供应商并且没有直接链接),那么其中一个设备会接收数据,而另一个不会。

这也无法完全在 3G 上运行。

我不明白的是,它是如何在每个网络上使用 1 台设备单向工作的,但对于同一网络上的两台设备却根本不工作?

【问题讨论】:

嗨,你能分享一下代码吗?或者给我任何链接以建立像你这样的连接? 我能为您做的最好的事情是建议您研究端口预测方法,主要是端口遍历。您可能需要对其进行大量挖掘和研究,但此页面似乎很有帮助。 deusty.com/2007/07/nat-traversal-port-prediction-part-1-of.html 本质上,您必须猜测路由器分配给每个客户端的端口号。要记住的另一件事是,客户端只会接受来自最近尝试与之通信的 IP 地址和端口号的传入消息。这是一个非常冗长的话题,需要大量的反复试验。 感谢您的回复 【参考方案1】:

我后来发现我们的一个路由器正在检测从一个客户端发送到另一个客户端的消息包含不同的目标 IP 地址到服务器,然后我们的路由器决定这些消息应该通过不同的外部端口。这就是问题的来源。使用一点端口预测,大多数时候可以克服这个障碍。

对于那些感兴趣的人来说,大多数情况下,如果在假定的端口上找不到连接,它很可能在下一个端口(即 Port# + 1)。如果没有,从那里开始工作会变得有点复杂。

【讨论】:

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

UDP打孔:单机可测试性

UDP打孔只能部分工作c#

Java TCP 打孔

UDP打孔混乱

TCP 打孔 Java 示例

UDP打孔无法外接