对战平台虚拟War3局域⽹的原理
以War3为例,启动魔兽后,⾸先是如何看见主机的问题:
魔兽是通过TCP/UDP协议进⾏数据发送的,那如何实现看到对⽅?我们这样:每个机器监听⼀个固定的UDP端⼝(⽐如6112),⼀旦任何机器建⽴主机,它就向整个局域⽹所有的机器的6112端⼝⼴播“我建⽴了主机”的信息,这样,其他机器接收到这个信息,就知道有主机建⽴了(⼴播只存在于UDP协议,使⽤UDP.sendto向地址255.255.255.255实现)。
来看看HF和VS平台怎么实现的:
1.挂钩UDP.Sendto,将所有⼴播信息(即发向地址255.255.255.255)的消息截获,然后把消息重新打包(⽐如{本机虚拟IP+消息数据}的形式),然后使⽤真正的UDP.sendto把消息转到平台服务器,服务器查看有哪些玩家是跟此玩家在同⼀房间,把消息传给那些玩家;平台再挂钩住接收消息⽤的v From,把vFrom的发送⽅地址修改为消息中的对⽅虚拟IP,再把数据传给真正的vFr om。
问:万⼀⼴播信息不是建⽴主机⽽是其他的,被误截了怎么办?
答:⼤部分游戏包括War3的⼴播信息唯⼀的作⽤就是传播“建⽴主机”这⼀类需要传给所有局域⽹的机器
的信息,就是说只有“建⽴主机”这⼀类信息会通过地址255.255.255,因此⼀般不会有误截发⽣。
实际上通过⼴播的信息还有主机是否⼈满,地图,主机是否取消建⽴,等信息。
其次,如何加⼊游戏:
魔兽在加⼊游戏后使⽤TCP协议,每个玩家对应⼀个连接。
在真正的局域⽹中,⼀个玩家看到和选择⼀个主机后点击加⼊,他的机器会使⽤TCP请求和对⽅连接,(地址从UDP中获得,端⼝是固定的6112),如果没有⼈满,被主机关闭等意外发⽣,主机就会答应此连接(使⽤TCP.accept),发送些数据(地图信息,其他玩家信息等),此玩家就加⼊了游戏,此后两机器就使⽤这个TCP连接通讯。
回到平台,在平台中,魔兽从UDP中获得的地址是服务器的地址啊(因为UDP信息是服务器转过来的),这样发起的TCP只能链接到服务器,怎么可能连接得上真正的玩家呢?别忘了,上⾯说过平台挂钩了UDP.sendTo(会把本机虚拟IP加⼊);挂钩了vFrom(会把服务器这个发送⽅的IP改为对⽅虚拟IP);
接着魔兽向对⽅虚拟IP发起t,可能成功吗?当然不可能,因为实际的局域⽹中根本没这个IP,那怎么请求连接和接受连接呢?
平台采⽤了这样的办法:TCP连接是靠t发起的,平台挂钩住这个函数,把连接向服务器的地址修改为⾃⼰(即127.0.0.1或实际IP,⼀般⽤前者),然后再挂钩TCP.accept函数(此函数⽤来接受TCP连接),然后发送同样的连接请求由服务器转到另⼀台机器(即主机),根据那台机器的做法决定是否答应127.0.0.1的那个t,(注意这个TCP.accept返回的新连接是挂钩代码创建的,挂钩的代码拥有它收到的所有数据),如果答应连接的话,是不是魔兽所有的数据就会发送到这个挂钩代码创建的连接这⾥了?
接着,挂钩代码把这些数据重新打包(例如{接收⽅机器的虚拟IP+发送数据+发送⽅的虚拟IP}的形式),使⽤UDP.sendto发到服务器,服务器从信息中获得接收⽅机器的虚拟IP,查其真正的IP,并把数据发送过去,跨⽹的TCP发送就完成了。
(另外⼀台机器也按以上⽅法同样处理)
魔兽是游戏数据传输时基于TCP连接,此时主机作为TCP的服务端,⾮主机是客户端。但是没办法在Internet上实现两个⾮服务器主机之间的直接TCP连接(这个可以看P2P的实现原理)。那对战平台是怎么实现在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上的联⽹对战也就实现了。
另外说⼀下T⼈挂的原理,为什么主机可以T⼈呢?为什么主机只是关闭本机的TCP连接就可以把远程的⾮主机玩家T出游戏呢?从上图我们应该可以获得答案。如果主机关闭了本地⽤来接受远程⾮主机传输的UDP信息的那个TCPClient,那么很显然,主机将不能获得这个⾮主机信息,远程的那个⾮主机也不能收到主机转发的游戏数据包了,这个时候这个⾮主机War3进程理所当然的认为⾃⼰与主机失去了连
接,T⼈挂的⽬的也达到了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论