关键字:游戏 服务器 客户端 防外挂加速

游戏当中有些动作要求必须间隔一定时间才能执行,比如跑步等动作。如果仅在客户端限制的话往往都被加速器(外挂)所破坏。本文假定客户端必须间隔400毫秒的数据包传输,提出服务器端解决加速问题的一种方法。

一、客户端发送若干数据包

t1=tc;

Send(…);

t2=tc;

Send(…);

t6=tc;

Send(…);

t1-6:每个数据包必须包含的发送时客户端当前时间值

Tc:客户端当前时间

二、服务器端接收若干数据包

Void OnConnect(void)
{
IsFirstData = True;
}
Void OnReceive(…)
{
......
T=DataPack.ClientTime; //T当前数据包内的时间值
if(IsFirstData) //第一次接收?
{
IsFirstData = False;
Tsf=Ts;  //记录当前服务器时间
Tcf=T;  //记录数据包内的客户端的时间值,T=t1
Tlst=T; //保存当次数据包中的时间值
}else
{
if(T - Tlst < 400)  //时间间隔验证
OnError();
if((T-Tcf) - (Ts-Tsf ) > Tnd+ Tx)  //时长验证
OnError();
if (Ts-Tsf) > MaxLong //每十分钟初始一次Tsf、Tcf,防止两端时间误差累加放大
{
Tsf = ts;
Tcf=T;
}
Tlst=T; //保存当次数据包中的时间值
}
……
}

Tsf:服务器收第一个数据包时的当前时间

Ts:服务器当前时间

Tcf:客户端第一个数据包里面的时间值

T:当前接收到数据包内的客户端时间值

Tlst:上次接收到的数据包的时间值

Tnd:网络传输延时时间的最大允许值,常量

Tx:客户端和服务器端的在最大计时周期内(MaxLong)的最大允许的时间累计误差,常量

(T-Tcf):当前数据包和第一个数据包间隔时长

(Ts-Tsf ):当前服务器时间和接收第一个数据包时的间隔时长

MaxLong:最大计时周期:10分钟,常量,适当调整

正常情况下(图一),数据包间隔时间和两端时间是符合规则的。但如果外挂要想插入两个数据包(图二)t7和t8,那么t7必须等于2400,t8必须等于2800才能满足(T - Tlst >= 400)条件,这样在接收到t8的时候(T-Tcf) - (Ts-Tsf )就有800毫秒的误差,当插入的数据包超过一定数量的时候(假定Tnd + Tx=1000)就会触发阀门((T-Tcf) - (Ts-Tsf ) > Tnd + Tx)打开,将该用户列入黑名单并断线。

实际游戏中,有效数据包需要限时,有些游戏不需要,应用起来可能还要复杂些。外挂也可能还有更多的应对策略,但此法可以参考来完善游戏中的防护机制。

游戏中防止加速的一种方法相关推荐

  1. npm使用国内镜像加速的几种方法

    npm使用国内镜像加速的几种方法 在使用npm过程中经常会遇到无法下载包的问题,本人在这里整理了几个npm使用国内镜像加速的方法,希望对大家有所帮助. 原始配置 npm config set regi ...

  2. 在JavaScript中重复字符串的三种方法

    In this article, I'll explain how to solve freeCodeCamp's "Repeat a string repeat a string" ...

  3. 在js中加html_在HTML文档中嵌入JavaScript的四种方法

    在HTML里嵌入JavaScript 在HTML文档里嵌入客户端JavaScript代码有4中方法: 1.内嵌,放置在标签之间  (少): 2.放置在有 3.放置自HTML事件处理程序中,该事件处理程 ...

  4. html怎么样取jsp中的路径,jsp中获得路径的两种方法和获得url路径的方法(推荐)

    是解决相对路径的问题,可返回站点的根路径. //这样获得的是绝对路径 //这样获得的是相对路径 能够更有效的防治连接的失效. request.getContextPath()得到的是项目的名字,如果项 ...

  5. mysql 统计条目_mysql 统计表中条目数量的几种方法

    mysql 统计表中条目数量的几种方法 展开 通常的方法是: select count(*) from `table_name` select count(1) from `table_name` s ...

  6. python写错了怎么更改-Python中修改字符串的四种方法

    在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...

  7. python自带的shell是什么-python中执行shell的两种方法总结

    一.使用python内置commands模块执行shell commands对Python的os.popen()进行了封装,使用SHELL命令字符串作为其参数,返回命令的结果数据以及命令执行的状态: ...

  8. matlab中单独存图_Matlab中图片保存的四种方法

    Matlab 中图片保存的四种方法 matlab 的绘图和可视化能力是不用多说的, 可以说在业内是家喻户晓的. Matlab 提供了丰富 的绘图函数,比如 ez** 系类的简易绘图函数, surf . ...

  9. python字符串中某个字符修改_Python中修改字符串的四种方法

    在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...

  10. 在php中可以使用几种方法定义数组,PHP中数组定义的几种方法

    在php.html" target="_blank">php和其他编程语言中,需要常常使用数组创建,我们在前端开发中,js的数组创建可以由new array创建,下 ...

最新文章

  1. 1270: [BeijingWc2008]雷涛的小猫
  2. java formatter()_Java Formatter locale()用法及代码示例
  3. icache的方面以及使用
  4. Flutter时间轴(timeline)
  5. linux权限bcd码是6,Linux权限管理(1)基本权限
  6. (二)安装redies,配置,启动
  7. 键盘定位板图纸_Alienware AW510K RGB矮轴机械键盘评测
  8. Android studio开发Android图灵智能聊天机器人,课程设计报告
  9. 搜狐全体员工遭遇工资补助诈骗,冲上微博热搜第一
  10. 网易云web安全工程师第二天
  11. 学习shell小窍门
  12. 移动硬盘中安装ubuntu系统——Vmware Workstation安装
  13. 勇敢面对人生的苦难(转载自https://www.xuemeiwen.com/)
  14. 图片转成pdf的免费软件
  15. (2)如何使用Artemis
  16. 【战国策】之《齐策·张仪为秦连横说齐王曰》
  17. ECG起搏器数据库 下载 PacedECGdb
  18. 一加7p鸿蒙rom,一加5和iPhone7 Plus哪个好?苹果7P与一加5区别对比
  19. 安卓开发实现双方比赛计时器
  20. 白银时代房地产如何赚钱?——旅游地产怎样玩?

热门文章

  1. 英文网站SEO优化技巧大全
  2. dota2 自定义官方服务器,DOTA2官网更新:服务器扩容 首部官方漫画发布
  3. 通过ip查看主机名和端口占用情况
  4. 大数据有十大应用领域,看看你用到了哪个?
  5. word中 设置标题级别 的 快捷键
  6. 移动平均法,加权平均法
  7. 最难学的十大编程语言,C++排第二,它竟是第一名!不服
  8. 阿里云ACE认证之理解CDN技术 1
  9. 如何判断环境变量为空
  10. git--取消文件跟踪(Tracked改为Untracked)