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