3

在过去的几天里,我一直在开发一款在线游戏,一款 2 人游戏,其中一个人启动服务器(侦听某个端口),另一个人通过输入他的 IP 连接到他。这种方法有两个问题:

  • 输入对方IP非常难受。
  • 服务器不能位于路由器后面,因为 NAT 会阻止它工作。

第一个问题可以通过匹配服务来解决,该服务会在用户不关心的情况下处理所寻址的 IP。但我不确定如何解决第二个问题。我已经阅读了有关“TCP 打孔”的信息,但根据我所阅读的内容,当两个玩家都在路由器后面时,不可能执行此操作。如果这是真的,那么像 Halo 3 这样的配对服务游戏如何运作?

提前致谢。

4

4 回答 4

1

您可以使用一种称为 UDP Hole Punching 的技术,因为游戏 UDP 无论如何可能是更好的选择。但是您仍然需要某种集合服务器来启用客户端的初始握手。

有关一般信息,请参见此处

于 2012-03-28T11:08:36.590 回答
1

我相信您的第二个问题也可以通过您的配对服务/服务器来解决。该服务器应该能够知道他们各自 NAT 后面的 2 个玩家的公共 IP 和端口。服务器将收到的数据包将包含每个玩家的公共 IP。服务器所要做的就是将一个玩家的公共 IP+端口转发给另一个。当每个玩家都知道对方的公共 IP 时,他们应该能够直接相互交谈。然而,NAT 穿越技术的成功很大程度上取决于每个 NAT 设备的配置。

在 VOIP/SIP 领域,他们有几个 RFC 来处理这个问题。检查使用STUNTURN的ICEICE-TCP (用于 TCP) 。如果您在游戏中实现这些协议可能有点矫枉过正,但我​​认为它们是学习 NAT 穿越技术的好资源。

于 2012-03-28T11:45:05.277 回答
0

GameDev.SE 上的这个问题有几个有用的答案,包括指向 NAT 穿透介绍的链接:http: //www.mindcontrol.org/~hplus/nat-punch.html

于 2012-03-28T11:09:52.363 回答
-1

您不应该编写只负责查找匹配项的匹配服务(AKA 服务器列表)。

更好的解决方案是创建一个玩家可以自动加入的主服务器。主服务器允许创建或加入现有的比赛。玩家不应该相互连接,他们应该始终连接到主服务器。

例如,Halo 的“主服务器”是 Xbox Live。

于 2012-03-28T14:58:48.953 回答