Files
metin2-client/docs/MESHPORT.md
T
shenandshen 507e687867 feat: add MeshPort overlay networking, item actions window, and AVA2 client enhancements
- 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
2026-10-16 01:29:57 -07:00

7.7 KiB
Raw Blame History

客户端内置 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。