From 6809e0a377de6157a1cb290b7c4739943a7350e3 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Tue, 30 Jun 2026 12:18:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(client):=20=E8=BF=9E=E6=8E=A5=E6=80=81?= =?UTF-8?q?=E5=BB=B6=E8=BF=9F=E5=8F=AA=E8=AE=A4=E5=86=85=E6=A0=B8=20urltes?= =?UTF-8?q?t,=E8=B7=B3=E8=BF=87=E7=9B=B4=E8=BF=9E=E5=AE=9E=E6=B5=8B(?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=20Windows=20=E6=96=B9=E6=B3=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 连接页延迟显示 ~3ms:连接态下 _measure 的直连 TCP 实测被全局 TUN 在本地接住, connect() 几毫秒即返回(假值),覆盖了内核 urltest 经 setLivePing 回写的真实 RTT (macOS system 栈 TUN 尤其明显)。Windows 端延迟本就取 sing-box urltest(clash API /proxies 的 history delay),macOS 经 libbox writeGroups 的 item.urlTestDelay 同源。 修复:_measure 在 connectionProvider.phase==on 时直接返回,不做直连实测——连接态延迟 只认 urltest(与 Windows 一致),断开后再恢复直连实测。 Co-Authored-By: Claude Opus 4.8 --- client/lib/state/nodes_provider.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/lib/state/nodes_provider.dart b/client/lib/state/nodes_provider.dart index 41b9665..9793a41 100644 --- a/client/lib/state/nodes_provider.dart +++ b/client/lib/state/nodes_provider.dart @@ -13,6 +13,7 @@ import '../models/node.dart'; import '../services/api_config.dart'; import '../services/latency_probe.dart'; import 'auth_provider.dart'; +import 'connection_provider.dart'; // ── 节点列表 AsyncNotifier ──────────────────────────────────────── @@ -101,6 +102,10 @@ class NodesNotifier extends AsyncNotifier> { /// 不把已知延迟覆盖成空——否则连上后节点列表延迟会整列消失。 Future _measure(List list) async { if (list.isEmpty) return; + // 连接态:全局 TUN 把「到节点的直连 TCP 握手」在本地接住,connect() 几毫秒就返回 + // (假值,非真实 RTT)。这会覆盖掉内核 urltest 经 setLivePing 回写的真实延迟(连接页 + // 因此显示 ~3ms)。连接时延迟只认 urltest,跳过直连实测;断开后再恢复实测。 + if (ref.read(connectionProvider).phase == VpnPhase.on) return; final pings = await probeAll( [for (final n in list) (uuid: n.uuid, host: n.host, port: n.port)], );