我正在编写游戏服务器,但我似乎无法在 c# 中找到如何 ping 客户端计算机(如果它们受防火墙保护)。
似乎也找不到有关游戏如何进行的任何信息。我的客户端计算机打开了一个 tcp 套接字,但我不知道如何从服务器获取 RTT 到该计算机。
关于如何实现这一目标的任何想法?
我正在编写游戏服务器,但我似乎无法在 c# 中找到如何 ping 客户端计算机(如果它们受防火墙保护)。
似乎也找不到有关游戏如何进行的任何信息。我的客户端计算机打开了一个 tcp 套接字,但我不知道如何从服务器获取 RTT 到该计算机。
关于如何实现这一目标的任何想法?
给定只有一个保证的通信路径(在您的情况下是现有的 TCP 连接),您最好的选择可能是ping
在您的网络通信协议中引入一个命令。客户端网络协议代码应在尽可能短的时间内对该命令做出反应,以避免引入更多与计算机功能有关的延迟,而不是网络延迟,但这并不是太关键,因为慢速计算机必然会具有较慢的游戏性能,因此具有较高的有效延迟。
然后的想法是让服务器发送一个带有时间戳值的 ping 命令,并让客户端简单地将该值重复回服务器。在服务器端接收时间戳并计算往返时间。
根据您尝试的准确度,时间戳可能只需要几个字节。假设您只能将精度降低到几十毫秒,并且根据网络的负载会有很多差异。通过正确的偏移计算,您可以在 2 字节时间戳中以毫秒分辨率获得超过 1 分钟的范围......对于大多数游戏来说已经足够了。
或者您可以发送一个没有附加时间戳的最小 ping 命令并在服务器上跟踪时间戳。在这种情况下,服务器需要保留已发送 ping 请求的列表,并在它们返回时按顺序处理它们。您可能需要至少一个 1 字节的标识符来识别丢失的命令,这样您就不会失去同步,这只会稍微有用一点。
或者,如果您的通信协议在传输的命令包中包含序列号,则让客户端始终返回最后一个命令包的序列号。您可以在服务器上保留一个长度有限的序列号和时间戳队列,并在客户端向您发送任何信息时计算 ping 时间。这增加了一些可能只对 ping 有用的字节开销,但将延迟代码集成到基本通信代码中,为您提供实时延迟数字,而无需安排 ping。
如果您在网络协议中进行命令队列以减少 TCP 开销,请确保您有一种方法可以将 ping 命令推送到队列的头部。
有一个完整的Ping课程可能会对您有所帮助。