文明6虚拟局域网联机教程(搜不到房间的解决办法)
Souris
2024年10月30日 09:26

如果你已经完成了组网,只是搜不到房间,可以直接看结论。

背景

最近沉迷《文明6》这款游戏,玩了100多个小时的我也算是踏入了萌新的大门。

了解到这款游戏不仅可以自己默默种田,还可以跟小伙伴一起种田,于是就跟朋友约了一起联机。

第一次联机是在同一个局域网下,面对面联机。但是众所周知,文明这款游戏懂不懂就是几十个小时起步,没办法每次都面对面联机。

于是,我就在想,能不能找个办法远程联机呢,这样每次就可以舒服地躺在沙发上,一个回合又一个回合了。

远程联机的两种方法

  • 使用官方服务器:了解到这种方法无论是挂加速器还是直连,都十分不稳定,所以直接不考虑

  • 异地组网:组建远程虚拟局域网,这种方式的商业和开源实现都很多,尝试使用这种方法

组网过程

这里异地组网的过程略,可以参见参考资料的文章,有很多免费产品,实在不行如果有云服务器的话,自己搭个openvpn也行。

总之,搭好vpn之后,启动游戏,发现搜不到房间。客户端是可以ping通服务端的,但就是搜不到房间。

通过在网上查阅资料,了解到文明6的服务器发现使用了广播udp包的方式,而有的虚拟局域网软件对于这种广播包并不会进行转发,服务端那边收不到广播包,也就没法完成后续流程了。

其实如果游戏能提供一个指定ip连接的方式,就可以绕过这个问题了,可惜没有。

所以,这里的重点就在于怎么解决虚拟局域网不转发广播包的问题,这个问题可能不止文明6有,很多局域网联机游戏都有。

解决虚拟局域网不转发广播包的问题

测试设备

iPhone12、iPad Pro

分析过程

先以iPhone12作为客户端,搜索房间。

 

可以看到,搜索房间使用的是发送到62900-62999的广播包,指定范围是为了避免端口冲突,但是正常情况下不会冲突。

使用真实局域网的状态

我们可以抓包的过程1,但是过程无法在旁路上完成抓包。

 

 

和真实局域网不同的是,虚拟vpn由于实现和策略不同,对于广播包的支持也是不一样的,至少,我用的pgy就没办法支持广播包的传输,这也就导致了搜不到房间的问题。

所以现在的问题,就很聚焦了,解决这个问题即可。

目前网上的解决方案,大多是针对pc和安卓的,要么是采用支持广播的虚拟vpn,要么是使用hook,对发送包的进程做修改。这些办法都有一定局限性,成功率也不是很高。

所以,经过思考,我联想到一句名言:计算机科学中的每个问题都可以用一间接层解决。

我们加个代理不就行了?

 

代理接收局域网的流量,接收到客户端发送的搜索房间的广播包,然后把这个广播包通过虚拟vpn发送到服务端,服务端响应请求到代理,代理再把房间信息的数据包返回到客户端。

通过python简单撸一下,一百行就能搞定(可以github搜索civ6-multiplay)

核心代码:

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的代理。

开启之后,能顺利加入房间了。

进入游戏,也能够正常玩。

结论

 

Github搜索civ6-multiplay

局域网内增加一台设备,部署代理python程序

需求

理论上这个方法对所有平台都有效,无论是ios、安卓还是pc。

需要增加一台设备,这个设备可以是windows-pc、可以是linux、可以是树莓派,可以是安卓手机,理论上只要是和客户端在同一个局域网下的,能跑python即可。

步骤

1、先在这台设备上,安装虚拟局域网的软件,打开虚拟局域网。

2、在这台机器上部署代理程序,修改配置,让这台机器一直跑着程序。

3、文明服务端也安装虚拟局域网的软件,打开虚拟局域网。客户端不需要使用虚拟局域网。

4、就像在真实局域网里那样正常联机就行。

 

最后,我想说的是,无论是电脑配置也好,无论是技术问题也好,都不是大问题,这种联机游戏要求最高的配置就是朋友。

祝大家都能找到志同道合能一起玩耍的小伙伴,祝大家玩得开心,玩得愉快。

 

参考资料

文明6联机方法与实践

异地组网的方案