游戏对战平台编写流程研究

游戏对战平台,在没有了解的情况下,总是给人一种很神秘的感觉,然而,当你对socket的理解到达一定程度之后,你就不会再觉得神秘。
       用一句话来总结这种技术:虚拟局域网(VLAN)。

   实现这种平台,主要是客户端,而客户端有很多种方法,就我所了解,可以用下面三种方法实现:
    1. 替换Windows socket DLL,然后,你想做什么就做什么吧。
    2. 进程注入,HOOK WinSock函数调用。
    3. 虚拟网卡驱动。

       其实,前两种技术,也是许多木马使用的方法。正所谓技术是一面双刃剑,看你要用到什么地方了。现在的对战平台,就我了解,使用的多是后两种方法。大多数是第二种----毕竟,第三种驱动在有些用户权限下是无法安装和使用的。
       浩方,QQ对战平台,VS等,基本上都是采用第二种方法。第三种方法,见过一个,效果还可以。

    下面介绍一下我研究时写的平台结构:
       整个平台包含两个组成部分:服务端和客户端。
       通讯方式:全部采用UDP通讯。
 
  零、基础知识:
     如果你有志与开发这样一个类似平台,我建议你先了解以下内容:
     a. Windows协议栈的简单了解。
     b. WinSock通讯。
     c. HOOK技术。
     d. 线程,进程之间的数据交换和通讯。
     e. 线程之间的同步。
     f. 线程注入。
     e. 其它的一些Windows开发的基础知识,就不一一列举了。

     这些都是基本功,基本功如何,决定了你能走到哪一步。

  一、服务端:
      服务器在逻辑上被分为了两部分:
      a. 用户服务器: 虚拟IP分配,用户管理,消息通知等。
      b. 转发服务器: 进行必要的数据转发(无法进行P2P通讯的)

  二、客户端:
     客户端也包含两个部分,
     a. 客户端EXE: 负责进行进程注入,与服务器通讯。
     b. 客户端DLL: 负责进行socket函数替换和处理。

    注:这里,服务器和客户端都有KeepAlive的功能,如果在一定时间内未收到包,则认为用户已经掉线。

  三、主要工作流程:
     这里主要对用户登陆和登出,启动和退出游戏这连个主要环节进行总结。
 
    a. 用户登陆过程
     +-------------------------------+
      |  输入用户名和密码,登陆 |
     +-------------------------------+
                     |
     +-----------------------------+
     |   发送登陆包到服务器    |
     +-----------------------------+
                    |
     +-----------------------------+
     |        处理反馈信息        |
     +------------------------------+
                |
           <登陆成功>   ------------失败-------------> [提示用户]
                |
     +------------------------------+
     |  请求其他在线用户信息 |
     +-----------------------------+

   用户登陆信息客户端处理流程
 
         +--------------------+
         | 收到用户登陆包 |
         +--------------------+
                  |
             <数据解析>----------------> [丢弃不合法数据包]
                  |
         <验证用户登陆信息> -----------失-败-------+
                  |                                                      |
                  |                                                      |
    +----------------------------+        +---------------------------------+
    |      分配虚拟IP地址        |        |反馈登陆失败信息到客户端|
    +----------------------------+        +-------------------------------+

                      |
    +--------------------------------------+
    |      添加用户到在线用户列表     |
    +--------------------------------------+
    |反馈用户登陆成功,服务器信息|
    |                   到客户端                |  (* 这里包含了转发服务器信息)
    +--------------------------------------+
                           |
       +------------------------------+
       |广播信息到所有登陆用户|
       +-----------------------------+

           用户登陆信息服务端处理流程(由用户服务器处理)

    b. 用户登出过程
     
             +--------------------+
             | 收到用户退出包 |
             +--------------------+
                       |
                   <数据解析>----------------> [丢弃不合法数据包]
                       |
             +----------------------+
             <  查找将用户信息  >   ------------> 未找到,不处理
             +---------------------+
                       |
       +----------------------------------------+
       |   将用户从在线用户列表中删除   |
       +---------------------------------------+
                       |
       +------------------------------------+
       |     回收虚拟IP给其他用户       |
       +-----------------------------------+
                       |
       +-------------------------------------------+
       | 广播用户登出信息到所有在线用户 |
       +-------------------------------------------+

           服务器处理过程

         <判断用户是否在游戏中>   -----------是------------> 提示用户
                  |
                否
                 |
       +-----------------------------+
       |   发送登出包到服务器    |
       +-----------------------------+
                  |
       +-------------------------+
       |          退出                |
       +-------------------------+
            客户端处理过程

  c. 游戏启动过程
 
       +--------------------------+
       |      创建内存共享        |
       |  (CreateFileMapping) |
       |   写入游戏当前配置    |
       | (包含在线用户信息和 |
       |    转发服务器信息)     |
       +--------------------------+
                 |
       +-----------------------------+
       | 根据用户选择启动游戏 |
       | (调用CreateProcess)   |
       +----------------------------+
                 |
          <是否启动成功>  ------------否----------> [提示用户失败信息]
                 |
       +-----------------------------+
       | 将游戏DLL注入到游戏 |
       +----------------------------+
                  |
    +--------------------------------+
    |     读取游戏的配置信息     |
    +-------------------------------+
                  |
    +-----------------------------+
    |       连接转发服务器       |
    +-----------------------------+
                  |
    +--------------------------------------+
    |  游戏DLL HOOK所有网络函数  |
    |   (采用Inline Hook方式)            |
    +-------------------------------------+
                  |
    +----------------------------------+
    |   OK, now game start OK!   |
    +----------------------------------+


  d. 游戏退出过程

   +----------------------------------------------+
   |  游戏DLL释放所有已经HOOK的函数  |
   +---------------------------------------------+
                  |
   +-----------------------------------+
   |     关闭内存共享文件            |
   +-----------------------------------+
                  |
   +--------------------------------------+
   |     发送退出包到转发服务器      |
   +--------------------------------------+

  四、游戏DLL工作过程:

     整个平台运作过程中,最主要的部分恐怕就是这个部分了,所以,单独将这部分的结构进行一下说明。
   
     在这里,我将处理过程分成了三个层,每个层分别完成不同的功能:网络HOOK层,自定义协议栈,网络数据传输层。
     首先,HOOK所有上层的网络函数调用,然后交给自定义协议栈进行处理,处理完成后,如果需要发送数据,则交由下层的网络发送层进行发送。

     +----------------------------------------------------------+
     |                                                                          |
     | 网络函数HOOK层: 主要负责网络函数的替换  |
     |                  并且交由下层处理                            |
     |    这里,其实也就是对于WS2_32.dll中的          |
     | socket函数进行替换。                                      |
     |                                                                         |
     +---------------------------------------------------------+
     |                                                                         |
     | 数据处理层:主要负责将上层的各种网络        |
     |                     函数功能调用进行处理。             |
     |    举个简单的例子,当游戏调用Socket函数     |
     | 准备创建一个socket时,我们根据它的参数, |
     | 内部虚拟出一个socket句柄给它。而实际的上 |
     | Windows本身并不知道这个调用过程。           |
     |                                                                       |
     +-------------------------------------------------------+
     |                                                                       |
     | 真实网络传输层:在这一层,才是真正的将数|
     |                 据包进行包装和发送的过程            |
     |                                                                       |
     +-------------------------------------------------------+

       其实,整个客户端只创建了两个socket,一个用于和服务器通讯的socket,另外一个就是在游戏DLL中创建的一个和转发服务器以及游戏之间通讯所使用的socket。
       这里重要的就是中间的那层,主要就是对于socket调用中的每个函数进行模拟。这个就需要各位自己去了解了。我不可能也没有能力把每个都描述出来。
       其实,这里的第二层处理也可以不采用我的这种方法,可以采用协议替换法,比如,当游戏调用socket函数要创建一个IPX socket时,你可以修改其中的参数,变成UDP,然后调用Windows真实的socket函数。

  五、主要的技术难点:
      a. 模拟Windows Socket。

     这个技术点,说起来就比较多了。我们知道Windows有六种socket模型,我们必须模拟出来大部分的模型(根据游戏所使用的模型不同而需要模拟的模型就不同)。
     根据我的跟踪和测试,说说现在了解的几个游戏所使用的socket模型和协议类型:

     《红色警戒》: 使用了简单的WSAAsyncSelect模型。(IPX协议)
     《星际争霸》: 使用了Select 模型。(IPX, UDP协议,根据用户的参数)
     《暗    黑》: 使用Select模型。(使用TCP协议)
     《反恐精英》: 使用Select模型。(使用TCP, UDP协议)
     《冰封王座》: 似乎使用了IOCP Socket模型。这个还不是很清楚。(使用TCP,UDP两种协议)

      b. 改进UDP数据通讯的可靠性。
         整个平台中,所有通讯全部使用的是UDP,所以,这点很重要。如果我们的游戏中采用了TCP通讯,我们在模拟的时候就的保证所有数据都能被对方收到。

   六、开发后记:
       去年的时候,我写过一个英文的对战平台研究,现在看看,那简直是垃圾!可能是那是比较浮躁,对于什么东西都没有了解清楚。一年后,再回过头来看我写的那些代码,真是惨不忍睹。现在,我觉得自己心静了很多,技术上也成熟了许多。想说的就是Windows开发,我可以算是入门了吧!呵呵!
      整个平台,只是在我的机器上进行测试和开发,难度比较大。工程。现在,我也只对《红色警戒》, 《星际争霸》, 《暗黑》三个游戏测试通过。感觉一个人开发实在太累了,而且,这些东西都是经过一次次的AV错误一步步调试出来的,想想那些岁月,真是不堪回首!暂时不想再继续下去了。等什么时候有精力和时间的时候再来处理吧。
      很多时候,为了能够调试通过一个函数,我不知要经历多少次的游戏重启过程。基本上MSDN上的大多数socket函数已经被我翻了个遍,每个函数的参数,返回值等都的了解。
      为了了解Windows实现socket的原理,阅读那份据说是Win2K的源码(如果你想阅读的话,到网上搜索一下,解压后大概有700M),关于socket的那部分代码在\win2k\private\net\sockets\winsock2\wsock32目录下(估计是WS2_32.dll的源码),读了很多内容,也了解了一些东西,也让我知道以后怎么去写socket程序。现在我有时写代码写累的时候,还会去看点Windows的源码,挺有意思的。像gina的实现,CommCtrl的实现等。
      代码大概已经写的至少有一两万行了,基本上都是我在EditPlus/NotePad中一个字母一个字母敲出来的。暂时不做共享,先分享一下原理篇给大家。

 

文章摘自:http://yulv.net/archives/497/    有自己动手做个对战平台的想法源自自己打魔兽争霸时的多年体会,浩方、QQ、vs、AA等对战平台使用上都有不尽如人意的地方,希望有高手可以提出看法,让游戏平台越来越适合广大电竞玩家。

转载于:https://www.cnblogs.com/wuyuan001/archive/2012/04/01/2428211.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此为代码,不带任何数据库,有很重要的研究价值 1.引言 4 1.1编写目的 4 1.2背景 4 1.2.1 中国战网对战平台产生的背景 4 1.2.2 对战平台的市场分析 4 1.3定义 5 1.4参考资料 6 1.5开发软件 6 2系统的结构 6 2.1客户端系统结构模块划分 6 2.1.1管道模块 6 2.1.2用户socket通信模块, 6 2.1.3主程序界面模块 6 2.1.4网络通信的信息库模块 7 2.1.5客户端界面基础类库 7 2.1.6检查系统进程加密等操作模块 7 2.1.7 检查系统进程记录数据信息写日志模块 7 2.1.8特殊cs1.5服务器客户端使用的动态连接库模块 7 2.2中国战网网络拓朴图 8 3.客户端设计说明 9 3.1客户端描述 9 3.2功能 9 3.2.1 用户登录 9 3.2.2 游戏房间、比赛房间,公共资讯 9 3.2.3游戏类型列表 10 3.2.4 房间成员信息显示 10 3.2.5 基于互联网络环境下的局域网 10 3.2.6 支持多种网络协议 10 3.2.7 支持多种局域网游戏 11 3.2.8 支持cs1.5战网服务器方式游戏 11 3.2.9 对战成绩统计和积分排名 11 3.2.10战队组队和战队排名 11 3.2.11丰富多彩的聊天系统 11 3.2.12强大的在线管理功能 12 3.2.13基于用户的针对性广告系统 12 3.2.15战币, 游戏币计费与帐务系统功能 12 3.3应用环境 12 3.4输入项 13 3.5输出项 13 3.6技术实现 13 3.6.1利用挂钩(Hook)插入DLL进行网络内容访问控制 13 3.6.2 tcp转udp设计方案 19 3.6.3 客户端皮肤方案 24 3.7客户端与服务器的流程逻辑 25 3.7.1 客户端与登陆服务器数据包流程 (TCP数据包) 25 3.7.2客户端与游戏服务器数据包流程 (TCP数据包) 27 3.8接口 30 3.9存储分配 31 3.10注释设计 31 3.11限制条件 31 3.12综合测试计划 31 3.12.1.待测产品: 31 3.12.2测试目的: 31 3.12.3测试环境: 31 3.12.4测试范围: 32 3.12.5测试策略 : 32 3.12.6测试资源 33 3.12.7测试内容 33 3.13尚未解决的问题 34 4.中国战网对战平台技术特点和优势 34
此为代码,不带任何数据库,有很重要的研究价值 1.引言 4 1.1编写目的 4 1.2背景 4 1.2.1 中国战网对战平台产生的背景 4 1.2.2 对战平台的市场分析 4 1.3定义 5 1.4参考资料 6 1.5开发软件 6 2系统的结构 6 2.1客户端系统结构模块划分 6 2.1.1管道模块 6 2.1.2用户socket通信模块, 6 2.1.3主程序界面模块 6 2.1.4网络通信的信息库模块 7 2.1.5客户端界面基础类库 7 2.1.6检查系统进程加密等操作模块 7 2.1.7 检查系统进程记录数据信息写日志模块 7 2.1.8特殊cs1.5服务器客户端使用的动态连接库模块 7 2.2中国战网网络拓朴图 8 3.客户端设计说明 9 3.1客户端描述 9 3.2功能 9 3.2.1 用户登录 9 3.2.2 游戏房间、比赛房间,公共资讯 9 3.2.3游戏类型列表 10 3.2.4 房间成员信息显示 10 3.2.5 基于互联网络环境下的局域网 10 3.2.6 支持多种网络协议 10 3.2.7 支持多种局域网游戏 11 3.2.8 支持cs1.5战网服务器方式游戏 11 3.2.9 对战成绩统计和积分排名 11 3.2.10战队组队和战队排名 11 3.2.11丰富多彩的聊天系统 11 3.2.12强大的在线管理功能 12 3.2.13基于用户的针对性广告系统 12 3.2.15战币, 游戏币计费与帐务系统功能 12 3.3应用环境 12 3.4输入项 13 3.5输出项 13 3.6技术实现 13 3.6.1利用挂钩(Hook)插入DLL进行网络内容访问控制 13 3.6.2 tcp转udp设计方案 19 3.6.3 客户端皮肤方案 24 3.7客户端与服务器的流程逻辑 25 3.7.1 客户端与登陆服务器数据包流程 (TCP数据包) 25 3.7.2客户端与游戏服务器数据包流程 (TCP数据包) 27 3.8接口 30 3.9存储分配 31 3.10注释设计 31 3.11限制条件 31 3.12综合测试计划 31 3.12.1.待测产品: 31 3.12.2测试目的: 31 3.12.3测试环境: 31 3.12.4测试范围: 32 3.12.5测试策略 : 32 3.12.6测试资源 33 3.12.7测试内容 33 3.13尚未解决的问题 34 4.中国战网对战平台技术特点和优势 34

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值