文明6虚拟局域网联机教程(搜不到房间的解决办法)
如果你已经完成了组网,只是搜不到房间,可以直接看结论。
背景
最近沉迷《文明6》这款游戏,玩了100多个小时的我也算是踏入了萌新的大门。
了解到这款游戏不仅可以自己默默种田,还可以跟小伙伴一起种田,于是就跟朋友约了一起联机。
第一次联机是在同一个局域网下,面对面联机。但是众所周知,文明这款游戏懂不懂就是几十个小时起步,没办法每次都面对面联机。
于是,我就在想,能不能找个办法远程联机呢,这样每次就可以舒服地躺在沙发上,一个回合又一个回合了。
远程联机的两种方法
使用官方服务器:了解到这种方法无论是挂加速器还是直连,都十分不稳定,所以直接不考虑
异地组网:组建远程虚拟局域网,这种方式的商业和开源实现都很多,尝试使用这种方法
组网过程
这里异地组网我选择了蒲公英这个工具,免费版是可以支持三个设备,考虑到我只有一个队友,所以够用了。如果你有更多的小伙伴,可以参考这个文章异地组网的方案,有很多免费产品,实在不行如果有云服务器的话,自己搭个openvpn也行。
总之,搭好vpn之后,启动游戏,发现搜不到房间。客户端是可以ping通服务端的,但就是搜不到房间。
通过在网上查阅资料,文明6联机实践,了解到文明6的服务器发现使用了广播udp包的方式,而蒲公英对于这种广播包并不会进行转发,服务端那边收不到广播包,也就没法完成后续流程了。
其实如果游戏能提供一个指定ip连接的方式,就可以绕过这个问题了,可惜没有。
所以,这里的重点就在于怎么解决虚拟局域网不转发广播包的问题,这个问题可能不止文明6有,很多局域网联机游戏都有。
解决虚拟局域网不转发广播包的问题
测试设备
iPhone12、iPad Pro
分析过程
先以iPhone12作为客户端,搜索房间。
可以看到,搜索房间使用的是发送到62900-62999的广播包,指定范围是为了避免端口冲突,但是正常情况下不会冲突。
使用真实局域网的状态
我们可以抓包的过程1,但是过程无法在旁路上完成抓包。
和真实局域网不同的是,虚拟vpn由于实现和策略不同,对于广播包的支持也是不一样的,至少,我用的蒲公英就没办法支持广播包的传输,这也就导致了搜不到房间的问题。
所以现在的问题,就很聚焦了,解决这个问题即可。
目前网上的解决方案,大多是针对pc和安卓的,要么是采用支持广播的虚拟vpn,要么是使用hook,对发送包的进程做修改。这些办法都有一定局限性,成功率也不是很高。
所以,经过思考,我联想到一句名言:计算机科学中的每个问题都可以用一间接层解决。
我们加个代理不就行了?
代理接收局域网的流量,接收到客户端发送的搜索房间的广播包,然后把这个广播包通过虚拟vpn发送到服务端,服务端响应请求到代理,代理再把房间信息的数据包返回到客户端。
通过python简单撸一下,核心代码:
data, (ip, port) = proxy_socket.recvfrom(BUFFER_SIZE)
address = ip_to_tuple(f"{ip}:{port}")
LOGGER.debug(f"receiving packet from address: {address}")
if address[0] == client_address:
LOGGER.debug(f"sending to server: {server_address}")
data = LOCAL_DATA_HANDLER(data)
proxy_socket.sendto(data, server_address)
client_port = port
elif address[0] == server_address[0]:
LOGGER.debug(f"sending to client: {(client_address, client_port)}")
data = REMOTE_DATA_HANDLER(data)
proxy_socket.sendto(data, (client_address, client_port))
else:
LOGGER.warning('Unknown address: {}'.format(str(address)))
尝试一下:
已经成功的收到服务器返回的有关房间信息的数据包了,而且,在客户端上也能看到服务端创建的房间。
点击加入房间,却卡住不动了,我们继续在代理上抓包分析
可以看到,在加入房间时,已经不再使用62900这个通信端口了,更改到了62056。
因此,我们同时开始对62056的代理。
开启之后,能顺利加入房间了。
进入游戏,也能够正常玩。
结论
增加一台设备,部署代理python程序
https://github.com/chenxi65535/civ6-multiplay
需求
理论上这个方法对所有平台都有效,无论是ios、安卓还是pc。
需要增加一台设备,这个设备可以是windows-pc、可以是linux、可以是树莓派,可以是安卓手机,理论上只要是和客户端在同一个局域网下的,能跑python即可。
步骤
1、先在这台设备上,安装虚拟局域网的软件(比如我这里使用的蒲公英),打开虚拟局域网。
2、在这台机器上部署代理程序,修改配置,让这台机器一直跑着程序。
3、文明服务端也安装虚拟局域网的软件,打开虚拟局域网。客户端不需要使用虚拟局域网。
4、就像在真实局域网里那样正常联机就行。
最后,众所周知,无论是电脑配置也好,无论是技术问题也好,都不是大问题,这种联机游戏要求最高的配置就是朋友。
祝大家都能找到志同道合能一起玩耍的小伙伴,祝大家玩得开心,玩得愉快。
参考: