2014-09-01 56 views
0

在一个网上农场类游戏我需要验证的服务器的客户端的漫长过程就像盖房子。说房子需要10分钟才能建成。客户端在开始建造房屋时通过TCP连接异步发送“开始建造”消息,当它认为建造房屋时发送“完成建造”消息。在服务器上,我需要验证该房屋是否至少在10分钟内建成。问题是服务器不知道客户端何时发送“开始构建”和“完成构建”消息。它知道什么时候接收到消息,但是网络滞后,可能的网络故障和消息可能足够长以接收几个tcp段。据我了解,客户端发送消息的时间可能长达几分钟,取决于客户端的TCP配置。问题是:有没有办法知道什么时候在客户端发布消息?如果没有,我如何保证该消息的发送时间,可能是一些服务器的TCP配置?该服务器中的某个超时会收到该消息,否则就会失败。对于我可能没有想到的主要任务的任何其他解决方案也是受欢迎的。如何知道当一个TCP消息发送

在此先感谢!

+0

为什么还在乎呢?你知道房子什么时候开始建造,让服务器在10分钟后向客户端发送消息。 – serakfalcon 2014-09-01 14:05:00

+0

房屋建造可以被打断,并且/或者具有不同工作速度的其他工人可以在之后开始建造。对于用户来说,它应该看起来尽可能平滑,不需要修改服务器的构建时间,所以服务器只会乐观地进行验证,而不是惩罚诚实的客户端,从而更好地让客户端进行欺骗。另一个原因是我不希望服务器运行单独的任务来确定何时将“完成构建”发送给可能未连接的客户端。如果没有其他选择,我可能不得不这样做,但我想寻找一种方法来首先限制客户滞后模糊。 – 2014-09-01 14:18:30

+0

如果你只是想减少滞后和不打扰客户作弊。比我推荐使用UDP,因为它在大多数情况下是真正的异步和比TCP更快的。由于你不想传输文件,但是很短的信息,它可能是你的游戏的最佳选择(就像大多数其他多人游戏一样)。 – 2014-09-01 14:27:27

回答

1

如果我理解正确的话,你的主要问题不是TCP本身(因为所描述的情形也可能发生使用UDP)相关的,但你的消息的年表和固定的时间表还没有被伪造。

所以,你要避免的唯一情况是:

STARTED send at 09:00:00 and received at 09:00:30 (higher latency) 
FINISHED send at 09:10:00 and received at 09:10:01 (lower latency) 

,因为它看起来到服务器,就好像有只花了9.5构建虚拟建筑分钟。但客户端没有作弊,只是第一条消息比第二条消息有更高的延迟。

其他的方式就没有问题:

STARTED send at 09:00:00 and received at 09:00:01 (lower latency) 
FINISHED send at 09:10:00 and received at 09:10:30 (higher latency) 

STARTED send at 09:00:00 and received at 09:00:10 (equal latency) 
FINISHED send at 09:10:00 and received at 09:10:10 (equal latency) 

如至少10分钟的两个消息的接收之间经过。

不幸的是没有办法,以确保客户不使用时间戳或欺骗等。如果您的客户端在消息中写入时间戳或者协议为您执行了它,则无关紧要。有两个原因:

  • 即使你的客户不作弊,客户端和 服务器的系统时钟可能不同步
  • 写在网络数据包的所有数据都只是字节,可以是操纵。有人可以使用RAW套接字并伪造整个TCP层

所以唯一可以肯定的是服务器收到消息的时间。一个简单的解决方案是,如果服务器认为接收到FINISHED消息时没有足够的时间,则发送包含留给客户端的时间的某种重试消息。所以客户可以调整施工动画,然后再发送FINISHED消息,这取决于剩下多少时间。

+0

问题与您所描述的完全相同 - 感谢我没有提供的漂亮插图。服务器只能看到收到消息的时间,并且可能小于或大于客户端发送的消息之间的时间。是的,服务器只能验证这个接收时间,任何时间戳都可能是伪造的。 – 2014-09-01 14:43:47

+0

我想到了RETRY解决方案,它需要一些客户端逻辑和回滚用户可以看到我们试图避免的。我会更好地原谅有点作弊的客户端,而不是强迫普通客户端重新绘制游戏或回滚进度。 – 2014-09-01 14:44:25

+0

问题是什么时候我必须原谅。在你的例子中,它只有30秒,但看到http://www.pcvr.nl/tcpip/tcp_time.htm#21_2这本书说9分钟!所以问题是我该如何管理这个时间,并把它减少到1分钟?据我所知套接字超时将无法工作,因为客户端可以每1分钟发送一小块消息块,整个消息仍然需要几分钟才能发送。 – 2014-09-01 14:45:50

相关问题