0

我的一个朋友做了一个可以在局域网上玩的小游戏,并让我改变它,这样它就可以在互联网上玩了。我不想对客户端应用程序进行重大更改。

创建游戏时,服务器会不断发送 UDP BROADCAST 数据包,告诉所有人游戏已创建。现在,我只需要更改此 BROADCAST 以便将这些数据包发送到一组 Internet IP 地址。

你能告诉我以下解决方案是否是一个好的解决方案:我将创建一个房间服务器,我们称之为“房间广播服务器”,其中包含加入房间的每个人的 IP 地址。然后,客户端不会发送该 BROADCAST 数据包,而是将数据包发送到房间广播服务器,该服务器会将这个数据包广播给加入房间的每个人。

问题是:客户端会从“room-broadcast-server”接收这些数据包,他们会尝试与 room-broadcast-server 通信,而不是与创建游戏的机器通信。我想愚弄客户,让他们认为数据包来自游戏服务器,而不是来自房间广播服务器。我怎样才能做到?

4

3 回答 3

1

您是只修改服务器,还是同时修改服务器客户端?我认为完全删除广播并让客户端明确选择他们想要连接的服务器会更简单,而不是依赖服务器广播。

作为版本 1,您可以简单地要求玩家在客户端中输入服务器的 IP 地址/DNS 名称以进行连接。

对于版本 2,您可以添加对“大厅”的支持,其中您有一个(已知的)中央大厅服务器,客户端和服务器都连接到该服务器以便找到彼此(因此服务器连接到大厅以宣布他们的存在,然后是客户端连接到大厅以浏览他们想要连接的服务器)。

在我一直在编写的一个游戏中(但由于缺乏空闲时间而暂时搁置:p)我将“大厅”服务器编写为一个简单的 PHP+MySQL Web 应用程序,并让客户端和服务器使用 HTTP 请求来轮询它用于更新等。这样,我可以在便宜的网络主机上托管中央大厅服务器,任何人都可以托管游戏(缺点是便宜的网络主机不允许任意套接字连接,所以我无法在其上实现 NAT 穿透,但是如果/当游戏变得流行时,我的计划是将大厅服务器移到更昂贵的主机上,该主机确实允许任意套接字连接......)

于 2010-07-18T23:56:41.217 回答
1

欺骗源地址不适合您的正常应用程序协议。它需要客户端机器上的特殊权限,它会被一些网络过滤器丢弃,而且通常是粗俗和反社会的。

由于您无论如何都在修改客户端(将消息发送到游戏服务器而不是广播地址),您可以简单地让游戏服务器将数据包的“真实来源”附加到它发送的每个数据包中,并拥有客户端期望并处理从游戏服务器收到的数据包中的这些信息。

于 2010-07-19T02:07:28.993 回答
0

Dean 的第二个选项的基本概念(一个中心大厅服务器 + 多个游戏服务器)很好,即使在零售在线游戏中也很常见。我不明白的一件事是你为什么要伪造 IP 地址。客户端不应该关心服务器 IP 地址是什么,只要它从它获取有效的数据包。此外,imo,您不需要创建单独的房间(?)服务器,因为游戏服务器可以/应该管理客户端列表,因为客户端通过大厅服务器连接。

于 2010-07-19T07:15:50.210 回答