• war3联机对战原理以及T人挂原理简述


    前日玩DOTA一连输几把,好不容易最后一把推上对方高地了,却被主给T了。痛定思痛,最近几天,我潜心研究了下魔兽T人挂,在这与喜欢DOTA的朋友分享下。

    首先谈谈局域网魔兽的联机机制吧。这部分我没有切肤之痛,所以也没深钻,只是想告诉大家我们开启魔兽或者主机建主都要对同一个网段发送各种各样的UDP广播包,注意,在这我是说同一个网段,这也就解释了为什么我们同一个学校的学生在学校局域网上玩DOTA还要用某个小软件,而不能直接看到,网段和局域网还是有区别的,在这我就不详解了。然后当我们点击“进入游戏”时,便与其他人建立了TCP连接。如图:

                                          

    上图中间那台为主机,注意,我这里只是画出了其他9台机子与主机的TCP连接,而实际上这10台机子两两之间都是有TCP连接的。我们可以在玩DOTA的时候从桌面上点击:开始 - 运行 - 输入cmd - 输入netstat -n回车,可以查看到这些TCP连接(显示的列表还有你其他进程此时的TCP连接,哪些是war3的用排除法应该就能找出),即使不是主机,也能看到18条TCP的连接(为什么会多一倍呢?嘿,有去有回呗)。聪明的童鞋会问了,那我为什么多此一举画个图出来还只标主机的9条(实际18条....囧)?因为啊,非主机之间的的TCP连接平时是不用的,我们的数据都是通过主机传输,所以我还故意标了显眼的红色。有人又要问了,明明有直通的还绕远,暴雪SB啊??这个是基于服务器/客户机技术模式所必须的,在这我就不深谈了,但有一点是显然的,其实效率并不会低多少,一般我们的一个动作的数据,总是要发给所有人的(不能9台机子上牛都跳了,而有一台机子上还没跳吧,那撼地神牛哭了汗),如此一来,用两种方式数一数走的路子应该是一样的。由此可见,一台好的主机在一场犀利的战役中是多么的重要,在此,我再次强烈呼吁那些“小霸王”就别建主!!当然,非主机之间的TCP连接也不是没用,比如在魔兽中我们与某位玩家私聊,或者主机退了(魔兽会马上将另外一个玩家选为主机),那些个TCp连接中的一对或一些就会有用处了。

    刚才说的是局域网玩DOTA的环境,下面再谈谈在对战平台上又如何。平台在其中所扮演的角色,比如用户ID与游戏名的绑定、让我们能看到Internet上有人建主、积分核算。。。这我都不深谈了。只是说说和做T人挂相关的一点。上面我提到游戏中10名玩家之间建立的是TCP连接,主机作为TCP的服务器端,非主机是客户端,此时我们最关键的问题,其实也是对战平台最关键的问题来了:没办法在Internet上实现两个非服务器主机之间的直接TCP连接!!!(注意,我在这扫下盲,服务器与客户机不是一个单纯的称谓,它们各自其中维系通信的代码是有很大区别的,就像我们打电话,电话接起来后都一样,但是接之前,两端干的事断然不同),而至于为什么不能直接TCP连接,我在这就不阐述了,要说起来too long too long....(其实为什么要用C/S模式以及这里为什么不能直接相连,想想我举的打电话例子应该能悟出一二)。

    那对战平台是怎么实现在Internet上通过War3的局域网模式连接对战的呢?简单来说是如果A建了一个主机,B要进A的主机,A通过平台转发过来的消息知道B要连接主机,就在自己本地创建一个TCP的客户端,让这个客户端与war进程的服务端连接,在魔兽中就相当于有玩家B连接进A主机建立的游戏,同时B主机在自己本地创建一个TCP服务端,让War进程的TCP客户端连接到自己本地的服务端。既然都是在本地建立的TCP连接,那么怎么实现主机和非主机的游戏数据交换的呢??

                           

    从上面的图可以看出,War3主机和非主机的数据交换,其实是在两个本地模拟创建的TCPsever和TCPClient之间进行的,当主机有数据要发给非主机,先会将数据发给主机本地的TCPClient,然后对战平台会从TCPClient数据缓冲池中取出数据,通过UDP的方式,发给非主机,非主机会将UDP数据放入TCPServer的发送数据缓冲池,由它发给魔兽进程中的TCPClient,反过来一样,这样就实现了魔兽数据的完成传输,Internet上的联网对战也就实现了。如果此时按照我以上所述输入netstat -n来查看,会看到与本机war3进程通信的9对TCP连接的源IP和目的IP都是127.0.0.1,这是一个环回地址,也就是本机IP地址。

    在这我还要强调一点,只要我们点击了“进入游戏”之后,对战平台基本上就与我们脱离了,此刻我们就像在一个局域网玩一样,游戏中的数据是基本不经过平台的,所以上图也没画出来。当然,除了类似“HF小贴士”之类的东西强行给我们看。

    以上说了那么那么长一段废话,现在我来揭露T人挂是怎么做到的:从上图我们应该可以获得答案。如果主机关闭了本地用来接受远程非主机传输的UDP信息的那个TCPClient,那么很显然,主机将不能获得这个非主机信息,远程的那个非主机也不能收到主机转发的游戏数据包了,这个时候这个非主机War3进程理所当然的认为自己与主机失去了连接,T人挂的目的也就达到了。由此,结合第一个图以及我上面部分的阐述,可以发现只有主机才能T人,想要做一个非主机T人的挂就不好办了(特殊手段不排除,但我没见过),当然,如果主机退了,后来充当主机的那个也能较容易的实现T人。

    真相揭露到这还没有结束,不然怎么能说我是真怒了。现在瞌睡了先到这,在下篇我将具体谈一下利用以上结论如何写一个T人挂。 

    虽然现在这年头十人九挂的,但是我写这个绝不是为了纵容恶习进一步地滋生。仅仅是分享给喜欢DOTA、喜欢魔兽、钟情对战平台的朋友来了解其中的奥妙,极端洁癖人士别喷我。

    http://blog.csdn.net/zhaoze87/article/details/6325866

  • 相关阅读:
    SetThreadAffinityMask设置线程亲缘性
    Delphi 获取北京时间(通过百度和timedate网站)
    delphi 实现微信开发
    翻书的效果:FMX.TSwipeTransitionEffect Animation
    [每日一题] OCP1z0-047 :2013-07-15 drop column
    Delphi获取当前系统时间(使用API函数GetSystemTime)
    Delphi代码中嵌入ASM代码
    Delphi Jpg和Gif转Bmp
    Delphi RichEdit的内容保存为图片
    Delphi 实现任务栏多窗口图标显示
  • 原文地址:https://www.cnblogs.com/iamdanger/p/3624638.html
Copyright © 2020-2023  润新知