From e0c35c5ee3b20e02e984618ecbebac0a1246e7cb Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Thu, 15 Jan 2026 17:40:06 +0800 Subject: [PATCH] fix: unexpected port in use error when change ports --- Changelog.md | 1 + .../setting/mods/clash-port-viewer.tsx | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Changelog.md b/Changelog.md index a1cefaf7a..68685cb46 100644 --- a/Changelog.md +++ b/Changelog.md @@ -32,6 +32,7 @@ - 修复 Windows 下系统主题同步问题 - 修复 URL Schemes 无法正常导入 - 修复 Linux 下无法安装 TUN 服务 +- 修复可能的端口被占用误报
✨ 新增功能 diff --git a/src/components/setting/mods/clash-port-viewer.tsx b/src/components/setting/mods/clash-port-viewer.tsx index 714ae1001..bb47861c2 100644 --- a/src/components/setting/mods/clash-port-viewer.tsx +++ b/src/components/setting/mods/clash-port-viewer.tsx @@ -112,6 +112,7 @@ export const ClashPortViewer = forwardRef((_, ref) => { close: () => setOpen(false), })); + // TODO 减少代码复杂度,性能开支 const onSave = useLockFn(async () => { // 端口冲突检测 const portList = [ @@ -140,14 +141,26 @@ export const ClashPortViewer = forwardRef((_, ref) => { return; } - for (const port of portList) { + const original = originalPortsRef.current; + const changedPorts: number[] = []; + + if (mixedPort !== original?.mixedPort) changedPorts.push(mixedPort); + if (socksEnabled && socksPort !== original?.socksPort) + changedPorts.push(socksPort); + if (httpEnabled && httpPort !== original?.httpPort) + changedPorts.push(httpPort); + if (redirEnabled && redirPort !== original?.redirPort) + changedPorts.push(redirPort); + if (tproxyEnabled && tproxyPort !== original?.tproxyPort) + changedPorts.push(tproxyPort); + + for (const port of changedPorts) { try { const inUse = await isPortInUse(port); if (inUse) { showNotice.error("settings.modals.clashPort.messages.portInUse", { port, }); - const original = originalPortsRef.current; if (original) { setMixedPort(original.mixedPort); setSocksPort(original.socksPort); @@ -201,7 +214,7 @@ export const ClashPortViewer = forwardRef((_, ref) => { }; // 提交保存请求 - await saveSettings({ clashConfig, vergeConfig }); + saveSettings({ clashConfig, vergeConfig }); }); return (