背景
自己实现搭建网络,在非同一个局域网下也可以玩魔兽争霸3冰封王座。一般我们是通过平台上玩魔兽争霸3地图,比如浩方平台,kk对战平台,何不自己尝试搭建一个。
分析
首先应用层下的运输层是使用的是tcp
或者udp
协议,我们可以通过Wireshark
工具去抓包观察数据包走向。我们用Wireshark
抓包那么多包,怎么知道那些数据包是魔兽争霸3的数据包。其实我们可以通过下面cmd命令查到应用进程,并通过进程查出他们的协议和端口。
cmd
# 在任务列表查包含`War`的任务
tasklist | findstr War
# 在端口列表中查包含`<pid>`进程的端口
netstat -ano | findstr <pid>
如下图,你会发现魔兽争霸3居然tcp和udp用了同一个端口6112,不是说同一个ip的tcp和udp不能同一个端口吗,原来同一个应用是下是可以tcp和udp占同一个端口的。
拿到协议和端口,我们可以在Wireshark
监听以太网并且过滤一下,在过滤栏输入
ini
udp.port == 6112 || tcp.port == 61122
你会发现当你在局域网
在创建房间
才会看到数据包,255.255.255.255
那不是广播地址
吗,那不是创建房间
后就广播出去,告诉其他电脑我已经开好房了,如图↓
我这边用了Hyper-V
虚拟机快速创建的window11
系统,新打开一个魔兽争霸3客户端,在局域网中可以看到我刚才的创建的房间,但是在Wireshark
监听的以太网是没看到新的数据包,说明虚拟机的数据包是没有走本地的以太网的,而是直连的。那我们可以通过Wireshark
监听vEthernet(Default Switch)
虚拟机网络,虚拟机中用魔兽争霸3创建房间,自己电脑则进入房间,你会看到一下面抓的数据包。
上面抓包信息,可以看到先是udp
协议后,才开tcp
协议。大概是流程是,魔兽争霸3在局域网选择房间界面时会监听6112
端口广播,收到广播后向目标ip
发送udp
信息询问房间信息,目标客户端就会通过udp
返回房间信息。当我们点击房间的时候,就会和目标ip
进行tcp
协议连接,这就是上面数据包的流程。
思路
通过上面的分析,数据就是先经过udp
后经过tcp
,那我们只要把这边魔兽争霸3udp
广播的数据发送到另一个魔兽争霸3客户端中,让他们相互交换数据,之后在让他们建立tcp
连接交换数据。因为不通过局域网,我们需要让他连接一个服务器,服务器有两个端口一个是用来交换udp
数据的,另一个用来交换tcp
数据的。
udp数据走向如上图,魔兽争霸3应用是监听了udp:0.0.0.0:6112
,我们可以通过java应用监听udp:192.168.1.10:6112
拿到广播,再通过java创建一个创建一个客户端连接服务端,通过服务端把数据传到另一台电脑上java客户端上,最后让java客户端发送到另一台的魔兽争霸3上。
tcp数据走向如上图,这个看起来复杂些,一个魔兽争霸3客户端的需要连接另一个魔兽争霸3客户端时,先下发指令告诉另一台客户端需要连接,赶紧连接服务端,然后在服务端等待队列连接,另一台魔兽争霸3连接成功时,就会加到服务器等待队列中,最后得到两个魔兽争霸3客户端连接就可以交换数据。
测试
用本机电脑加虚拟机跑魔兽争霸3,连接云服务测试是可以跑通的。
代码
感兴趣可以下载代码跑跑。断续/war3Demo (gitee.com) 断续/war3Demo (gitee.com)