【发布时间】:2019-01-13 00:15:59
【问题描述】:
您好,我对 UDP 打孔的工作原理以及如何实现它感到有些困惑。根据这篇维基百科文章: https://en.m.wikipedia.org/wiki/UDP_hole_punching#Flow 想要建立 p2p 连接的客户端都必须与服务器建立 UDP 对话,以便交换 ip 和打孔。我感到困惑的是,假设客户 a 想要与客户 b 发起 p2p 对话。客户端 b 如何知道连接到服务器以便客户端交换 IP?这是必需的,否则他们将不知道其他客户端的 IP。我是否以某种方式误解了这个概念?
【问题讨论】:
-
客户端都需要知道如何联系服务器(不知何故),并且两个客户端都需要提前联系服务器,以便服务器知道它们正在运行。
-
那么我应该存储应用程序公共ip中存在的每个客户端并定期更新吗?这样每次一个客户端想要与另一个客户端通信时,它只会从服务器获取他们想要与之通信的客户端的 ip?抱歉,我对这些东西不熟悉。
-
一种方法是让每个客户端定期 ping 服务器(通过 UDP 数据包或 TCP 连接),并且每当服务器收到此 ping 消息时,它应该存储源 IP 地址(如由服务器上的 recvfrom() 或 getpeername() 返回)在本地数据结构中,以及客户端希望包含在 ping 数据中的任何标识信息。然后,每当另一个客户端向服务器查询客户端位置信息时,服务器将(希望)将该信息发送给客户端。
-
我在想类似的事情。感谢您的帮助。
标签: networking udp hole-punching