首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

年终总结(三):游戏对战平台研究终结篇,该如何处理

2012-02-24 
年终总结(三):游戏对战平台研究终结篇本来,不打算写第三篇了,因为没有太多东西可以写,而且总觉得自己写的

年终总结(三):游戏对战平台研究终结篇
本来,不打算写第三篇了,因为没有太多东西可以写,而且总觉得自己写的东西很肤浅。不像技术文章,更像入门级别的。但看到大家都挺支持我的,就再写一篇。
  不过,这一篇中,没有代码共享给大家,只是简单的原理篇。喜欢代码的可能要失望了。你的当成散分帖好了。
  得分规则参考第一帖。

原帖地址:
http://blog.163.com/etomahawk.popo/blog/static/919644820081131115223397/

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

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

  其实,前两种技术,也是许多木马使用的方法。正所谓技术是一面双刃剑,看你要用到什么地方了。现在的对战平台,就我了解,使用的是后两种方法。大多数是第2中----毕竟,驱动在有些用户权限下是无法安装和使用的。
  浩方,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的函数 |
  +---------------------------------------------+
  |
  +-----------------------------------+
  | 关闭内存共享文件 |
  +-----------------------------------+
  |
  +--------------------------------------+
  | 发送退出包到转发服务器 |
  +--------------------------------------+

.....
(您只能输入 8000 个字符) 郁闷!只能到原帖去看了!


[解决办法]
支撫,學習
[解决办法]
蹭点分,顺便赞 LZ ...
[解决办法]
顶起来了啊
[解决办法]
学习
[解决办法]
up

[解决办法]
牛人
[解决办法]
向牛人学习了
[解决办法]
顶啊。 虽然不懂
[解决办法]
关注一下
此帖不错
最近作socket方面的开发 可以作为参考了
有时间交流一下
[解决办法]
不错
[解决办法]
挺好!
[解决办法]
先顶
[解决办法]
台上一分钟,台下十年功
[解决办法]
帮顶
[解决办法]
虽然能看懂些,但是要自己做的话,那就不知道下手了,
[解决办法]
正在看socket想自己写个,
供自己玩,
呵呵。
有很大用处,
呵呵,
谢谢!!!
[解决办法]
学习
[解决办法]
顶起来。
[解决办法]
mark.下午接着看
[解决办法]
nan难通
[解决办法]
学习!good!
[解决办法]
不懂。帮顶。
[解决办法]
WQDQDWFFWFFQHGDGVBIGDIQD
[解决办法]
QDWQFGTHTGFJGTYJTYJTYRHEGEGWEWF
[解决办法]
up
[解决办法]
有含量 该顶
[解决办法]
学习,受益!谢谢楼主!

[解决办法]
我是新人,学习学习
[解决办法]
哦 原来如此
[解决办法]
hehe 很好咯 需要学习
[解决办法]
浩方原来是这么一回事!

[解决办法]
浩方是这样的啊
[解决办法]
哈哈。我知道了
[解决办法]
up
[解决办法]
recv
[解决办法]
学习了.
[解决办法]
虽然经常耍游戏平台,但是不懂
[解决办法]
支持一下!

顶楼主.

此技术知道,就是自己实现不了
------解决方案--------------------


我就只是想做游戏,不想做什么游戏平台。
[解决办法]
你们都是高手!!小弟还是关注关注!!
[解决办法]
强烈支持!
[解决办法]
高手,学习。
[解决办法]
顶起来~
[解决办法]
学习
[解决办法]
GOOD
[解决办法]

探讨
不懂,帮顶

[解决办法]
有道理,不过没做过虚拟网卡阿,看看看看
[解决办法]
fasdfasfsafsf
[解决办法]
楼主好人呐...
[解决办法]
学习
[解决办法]
up

热点排行