局域网联机可能会遇到两个问题,一个是可能配置好局域网了,但是在游戏里搜不到人,一个是能搜索到但是会卡在检索创建人信息里进不去。
第一个问题,【文明6虚拟局域网联机教程(搜不到房间的解决办法)-哔哩哔哩】 网页链接
这位大佬已经发过文章并做了解释,这儿不再赘述。
第二个问题的话主要因为大多数局域网只建立点对点的隧道连接,,不会把广播包从房主转发给客户端,于是导致游戏一直卡住。于是让ai把上面那位大佬的python脚本做了下优化,让房主的机器把数据转发给所有的客户端,从而建立连接。
使用方法:
1,建立虚拟局域网连接,并且能互相ping通
2,用win+r,输入cmd打开命令提示符(或者在开始菜单里搜索命令提示符打开),输入
pip install psutil
等待下载完成
3,下载一个Idea Shell(或者你有其他可以运行python脚本的软件,程序也可以)
4,创建一个新项目,把下面的代码全部复制上去,ip改成房主的ip,运行即可。
另外,欢迎大家加入522939568游戏群,如果大家有什么问题的话可以来群里聊天,什么游戏都能聊。或者群里也有打包好的文件,大家直接下载即可
===================================================
以下是代码
#先在命令提示符里输入 pip install psutil
#然后改一下房主ip并运行
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
SERVER_VIP_IN_VPN = "1.1.1.1" # 房主虚拟IP
import logging
import socket
import psutil
import time
from concurrent.futures import ThreadPoolExecutor
FORMAT = '%(asctime)-15s %(levelname)-10s %(message)s'
logging.basicConfig(format=FORMAT)
LOGGER = logging.getLogger()
LOGGER.setLevel(logging.INFO)
BUFFER_SIZE = 4096
GAME_NAME = "CivilizationVI.exe"
# ---------------------------------------------------------------------------
def ip_to_tuple(ip):
ip, port = ip.split(':')
return (ip, int(port))
def udp_proxy(bind, dst):
"""
UDP代理函数,支持多个客户端
bind: 本地监听端口,例如 "0.0.0.0:62900"
dst: 服务器地址,例如 "10.185.147.12:62900"
"""
proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
proxy_socket.bind(ip_to_tuple(bind))
server_ip, server_port = ip_to_tuple(dst)
LOGGER.info(f"[代理启动] 本地绑定 {bind} → 服务器 {server_ip}:{server_port}")
clients = {} # key=client_ip, value=port
while True:
try:
data, (ip, port) = proxy_socket.recvfrom(BUFFER_SIZE)
# 如果是客户端发来的包
if ip != server_ip:
clients[ip] = port # 更新/新增客户端端口
proxy_socket.sendto(data, (server_ip, server_port))
# 如果是服务器发来的包
elif ip == server_ip:
for c_ip, c_port in clients.items():
proxy_socket.sendto(data, (c_ip, c_port))
else:
LOGGER.debug(f"未知来源 {ip}:{port}")
except Exception as e:
LOGGER.warning(f"错误: {e}")
time.sleep(1)
# ---------------------------------------------------------------------------
def find_game_udp_ports():
"""查找文明6使用的UDP端口"""
ports = set()
for conn in psutil.net_connections(kind="udp"):
if conn.pid:
try:
p = psutil.Process(conn.pid)
if GAME_NAME.lower() in p.name().lower():
ports.add(conn.laddr.port)
except (psutil.NoSuchProcess, psutil.AccessDenied):
continue
return sorted(list(ports))
# ---------------------------------------------------------------------------
def monitor_and_proxy():
"""持续检测文明6端口,并启动对应的代理"""
active_ports = set()
executor = ThreadPoolExecutor()
while True:
ports = find_game_udp_ports()
new_ports = set(ports) - active_ports
for port in new_ports:
LOGGER.info(f"检测到新端口 {port},启动UDP代理...")
executor.submit(udp_proxy, f"0.0.0.0:{port}", f"{SERVER_VIP_IN_VPN}:{port}")
if new_ports:
LOGGER.info(f"当前已代理端口: {sorted(active_ports | new_ports)}")
active_ports |= new_ports
time.sleep(5)
# ---------------------------------------------------------------------------
if __name__ == "__main__":
LOGGER.info("=== 文明6 N2N UDP自动代理启动(多客户端支持) ===")
monitor_and_proxy()