- add MeshPort peer-to-peer overlay networking SDK, C++ integration, and Python bindings - add item actions quick use/split/delete/lock overlay window (mt_item_actions) - add shop name range and NPC name visibility settings to system display options - support battlepass ticket activation and month validation in mt_battlepass - support boss tracking teleport destination button in mt_bosses - support asynchronous account registration cancellation and pending login cancellation - update AVA2 item conversion for attr lock scrolls and battlepass tickets - update .gitignore for local build outputs and caches
7.7 KiB
客户端内置 MeshPort:同网段直连,跨网段统一组网
SDK 源码在 third_party/meshport/;客户端的后台运行时在 src/meshport/runtime/,TCP/UDP 平台适配在 src/meshport/transport.cpp。不依赖相邻的 MeshPort 工程或另行安装的 MeshPort 应用。
统一路径
组网按每一个目标 IPv4 地址决定,位于原生网络层,不依赖登录窗口或按钮。首次跨网段请求(包括登录前频道查询、先注册、先发送 UDP、命令行自动登录)都可触发后台启动。
| 请求 | 接入点 |
|---|---|
| 登录前频道状态查询 | CServerStateChecker → CNetworkStream;当前实现是 TCP |
| 账号认证、游戏连接 | CAccountConnector、CPythonNetworkStream → CNetworkStream |
| 换地图、换线、断线后的新连接 | 每次 CNetworkStream::Connect 重新判断目标地址 |
| 公会图标/标志上传和下载 | CGuildMarkUploader、CGuildMarkDownloader → CNetworkStream |
| 注册账号 HTTP | PythonAccountRegister.cpp 的工作线程使用相同 TCP 连接与 SOCKS 协商 |
| 通用 UDP | CNetworkDatagram、CNetDatagramSender、CNetDatagramReceiver → 统一 SOCKS5 UDP ASSOCIATE |
百科、洗练、拾取、战令等服务端命令复用游戏连接,自动跟随该连接的路径。域名沿用系统 IPv4 解析,解析后的地址进入相同判断;纯数字开头的域名不会再被误当成 IP。游戏现有封包、加密、原始数据内容保持不变。
路由与生命周期
- 使用本机已启用网卡的实际 IPv4 地址、子网掩码判断,不假定
/24。排除回环、点对点及 TUN/TAP 网卡;回环目标直接连接,便于本地测试。 - 同网段直接使用系统 TCP/UDP,不为了本地请求启动 MeshPort。一个客户端可以同时访问同网段与跨网段目标。
- 跨网段只使用 MeshPort;没有配置、引导连接失败、路由缺失或 SOCKS 被拒绝时返回失败,不退回系统直连。
- 首次需要时才后台启动 SDK。复用保存配置中的网络身份、密钥、引导节点及传输选项,强制应用模式、
dhcp=true、清空固定 IPv4 和监听端口。 - 等待动态 IP 和 SDK 接受的公告子网就绪。引擎启动、发现节点或仅获取 IP 均不算连接成功;TCP 的远端 SOCKS 建连成功或收到有效 UDP 回包后才提示“组网成功”,约 6 秒。
- 同一 SDK 由全部请求共享,多个请求不会重复启动,也不会因另一次登录停止现有连接。运行期间刷新健康状态和子网,后续新目标、重连均重新检查路由。
- 地址/路由准备最多 60 秒,SOCKS 建连最多 10 秒;原生 TCP 给整个准备流程最多 75 秒。UDP 发送队列有数量、字节和时限上限,防止断网时无限积压。
- UDP 保留原始来源 IP/端口、数据报边界及
MSG_PEEK,直连和组网回包可由同一接收 API 读取。TCP 控制连接、UDP relay 与原始 socket 一起回收。 - 关闭注册窗口会取消路由等待和 HTTP I/O,已发送到服务器的请求无法撤回,不做自动重发。退出时先取消并等待注册线程,再停止 SDK;关闭普通连接会移除其待完成协商。登录窗口的取消/退出也只取消尚在准备的账号及游戏连接,不中断独立频道查询或已建立的连接。
- 网卡变化后,新连接和每次发送都重新判断;排队的 UDP 若变为同网段,则改走直连。已经建立的 TCP 会话不能迁移到另一条路径:断线后沿原客户端流程返回登录/建立新连接,新连接重新判断;没有新增自动登录或自动重放业务请求。
使用应用内桥接,不创建系统 VPN、不安装 OS 路由。MeshPort 自己的引导/打洞连接仍使用系统网络,避免组网递归。
SDK 的 DHCP 子网修复
原 SDK 的公告子网过滤器捕获 TomlConfig.get_ipv4()。DHCP 启动时它为空,动态地址分配后也不会更新,造成“有 IP、有节点,但无法接受服务器网段”。本地修复从运行中的节点快照更新过滤器,再投影接受的子网;变更记录在 third_party/meshport/UPSTREAM.md。
私有配置
当前开发机默认读取 ~/Library/Application Support/MeshPort/network-profile.toml。其他电脑可将同一网络的配置放入忽略规则覆盖的 config/meshport.private.toml,或设置 CMake 参数:
cmake -S . -B build/release -DMT_BUILD_NATIVE_RENDER=ON \
-DMT_MESHPORT_CONFIG="/path/to/network-profile.toml"
配置在构建时读入生成头文件;开发运行时可用环境变量 MT_MESHPORT_CONFIG 覆盖。私有配置不进入 Git;包含配置的 APK/可执行文件应按私有客户端分发。错误提示不输出密钥。
构建
需要 Rust 1.95+(cargo 在 PATH 内)和 protoc(在 PATH 内或通过 PROTOC 指定)。依赖固定在 Cargo.lock,首次构建需要下载注册表依赖。编译产物默认放在 build/meshport-runtime;运行时及其 SDK 作为一份静态库链接,不依赖动态 MeshPort 库。
./scripts/build_meshport.sh macos
cmake -S . -B build/release -DCMAKE_BUILD_TYPE=Release \
-DMT_BUILD_NATIVE_RENDER=ON -DCMAKE_PREFIX_PATH=/opt/homebrew
cmake --build build/release --target mt_native_render -j8
Android arm64:./android/build.sh Release --no-deploy 会先编译运行时和 SDK,再构建客户端和 APK。独立构建可执行 ./scripts/build_meshport.sh android;最低 API 24,链接对齐 16 KB 页面。
MT_MESHPORT_LIBRARY 可覆盖静态库路径,MT_MESHPORT_ROOT 可覆盖 CMake 中 SDK 头文件路径。组网关闭的专项测试可设置 -DMT_ENABLE_MESHPORT=OFF。
验证
本地真实 SDK 网关将公告网段映射到回环 TCP/UDP 测试服务,测试安装零条 OS 路由,无需管理员权限。构建测试网关时使用与运行时相同的 Cargo target 目录:
CARGO_TARGET_DIR="$PWD/build/meshport-runtime" cargo build \
--manifest-path src/meshport/runtime/Cargo.toml \
--example gateway_fixture --release --locked
cmake -S . -B build/native -DBUILD_TESTING=ON
cmake --build build/native --target meshport_transport_test meshport_network_paths_test -j4
ctest --test-dir build/native -R '^meshport\.' --output-on-failure
python3 tests/meshport/test_network_paths.py \
build/native/src/meshport/meshport_network_paths_test --client
测试包括:实际子网掩码、同网段零组网启动、UDP 首次请求触发 DHCP、真实公告子网 TCP/UDP 转发、UDP 来源与 peek、并发账号/游戏类型连接、HTTP、缺失路由不直连、取消协商、SOCKS 分片/拒绝、失败提示与成功提示生命周期。--client 还启动真实 Python 2.7 原生客户端,调用实际注册接口验证取消后重新注册。
跨公网到正式服务器的完整游戏登录、Android 真机切换 Wi-Fi/移动网络需要相应网络与设备验收;本地回环网关测试不能代替这些现场验证。
本次本机验证记录(2026-10-16):
- macOS 原生客户端和 Android arm64 APK 构建成功。
meshport.transport、meshport.login、meshport.network_paths、meshport.dhcp、port.net共 5 组通过:build/meshport-final-tests.log。- 真实 Python 2.7 客户端验证了登录前路由、取消待完成登录、实际 HTTP 注册、取消后重新注册:
build/meshport-path-client-tests.log、build/meshport-registration-runtime.log。 - 完整
port.login_flow的账号/加密登录及前段网络检查通过,后段 NPC 商店/任务/仓库点击检查仍有 27 项失败。用关闭组网模块的对照程序复验,失败数量和源码行号完全相同;此项不记为整体通过。日志:build/meshport-regression-tests.log、build/meshport-baseline/test.log。