diff --git a/Netch/Controllers/Interface/Controller.cs b/Netch/Controllers/Interface/Controller.cs index 8e3b11d7..1d47bffb 100644 --- a/Netch/Controllers/Interface/Controller.cs +++ b/Netch/Controllers/Interface/Controller.cs @@ -12,7 +12,7 @@ namespace Netch.Controllers /// /// 当前状态 /// - public State State { get; set; } = State.Waiting; + public State State { get; protected set; } = State.Waiting; /// /// 停止 diff --git a/Netch/Controllers/MainController.cs b/Netch/Controllers/MainController.cs index 0108533f..d965f347 100644 --- a/Netch/Controllers/MainController.cs +++ b/Netch/Controllers/MainController.cs @@ -19,9 +19,9 @@ namespace Netch.Controllers /// public static readonly List UsingPorts = new List(); - public EncryptedProxy pEncryptedProxyController; + public EncryptedProxy pEncryptedProxyController { get; private set; } - public ModeController pModeController; + public ModeController pModeController { get; private set; } private Server _savedServer; private Mode _savedMode; @@ -33,11 +33,11 @@ namespace Netch.Controllers if (_savedMode == null || _savedServer == null) return string.Empty; - var text = new StringBuilder(); if (_savedServer.Type == "Socks5" && _savedMode.Type != 3 && _savedMode.Type != 5) // 不可控Socks5, 不可控HTTP return string.Empty; + var text = new StringBuilder(); if (_localAddress == "0.0.0.0") text.Append(i18N.Translate("Allow other Devices to connect") + " "); @@ -96,40 +96,38 @@ namespace Netch.Controllers } else { - switch (server.Type) + pEncryptedProxyController = server.Type switch { - case "SS": - pEncryptedProxyController = new SSController(); - break; - case "SSR": - pEncryptedProxyController = new SSRController(); - break; - case "VMess": - pEncryptedProxyController = new VMessController(); - break; - case "Trojan": - pEncryptedProxyController = new TrojanController(); - break; - } + "SS" => new SSController(), + "SSR" => new SSRController(), + "VMess" => new VMessController(), + "Trojan" => new TrojanController(), + _ => pEncryptedProxyController + }; KillProcessByName(pEncryptedProxyController.MainFile); // 检查端口是否被占用 - if (PortHelper.PortInUse(Global.Settings.Socks5LocalPort)) + var isPortNotAvailable = false; + if (_savedServer.Type != "Socks5") { - MessageBoxX.Show(i18N.TranslateFormat("The {0} port is in use.", "Socks5")); - return false; + isPortNotAvailable = PortCheckAndShowMessageBox(_socks5Port, "Socks5"); } - if (PortHelper.PortInUse(Global.Settings.HTTPLocalPort)) + switch (_savedMode.Type) { - MessageBoxX.Show(i18N.TranslateFormat("The {0} port is in use.", "HTTP")); - return false; + case 0: + isPortNotAvailable = isPortNotAvailable || PortCheckAndShowMessageBox(_redirectorTCPPort, "Redirector TCP"); + break; + case 3: + case 5: + isPortNotAvailable = isPortNotAvailable || PortCheckAndShowMessageBox(_httpPort, "HTTP"); + break; } - if (PortHelper.PortInUse(Global.Settings.RedirectorTCPPort, PortType.TCP)) + if (isPortNotAvailable) { - MessageBoxX.Show(i18N.TranslateFormat("The {0} port is in use.", "Redirector TCP")); + Logging.Error("主控制器启动失败: 端口被占用"); return false; } @@ -139,6 +137,9 @@ namespace Netch.Controllers if (result) { + // 加密代理成功启动 + UsingPorts.Add(Global.Settings.Socks5LocalPort); // 记录Socks5使用端口 + switch (mode.Type) { case 0: // 进程代理模式 @@ -165,24 +166,19 @@ namespace Netch.Controllers if (result) { - #region Add UsingPorts + // 成功启动 - switch (mode.Type) + switch (mode.Type) // 记录使用端口 { - // 成功启动 + case 0: + UsingPorts.Add(_redirectorTCPPort); + break; case 3: case 5: - UsingPorts.Add(Global.Settings.HTTPLocalPort); - break; - case 0: - UsingPorts.Add(Global.Settings.RedirectorTCPPort); + UsingPorts.Add(_httpPort); break; } - if (server.Type != "Socks5") - UsingPorts.Add(Global.Settings.Socks5LocalPort); - - #endregion switch (mode.Type) { @@ -243,5 +239,19 @@ namespace Netch.Controllers // ignored } } + + /// + /// + /// + /// + /// + /// + /// 端口是否被占用 + private static bool PortCheckAndShowMessageBox(int port, string portName, PortType portType = PortType.Both) + { + if (!PortHelper.PortInUse(port, portType)) return false; + MessageBoxX.Show(i18N.TranslateFormat("The {0} port is in use.", portName)); + return true; + } } } \ No newline at end of file diff --git a/Netch/Forms/MainForm.Control.cs b/Netch/Forms/MainForm.Control.cs index 512d07d1..6f1a1ab5 100644 --- a/Netch/Forms/MainForm.Control.cs +++ b/Netch/Forms/MainForm.Control.cs @@ -56,7 +56,7 @@ namespace Netch.Forms catch (Exception e) { if (e is DllNotFoundException || e is FileNotFoundException) - MessageBoxX.Show(e.Message + "\n\n" + i18N.Translate("Missing File or runtime components"), owner: Global.MainForm); + MessageBoxX.Show(e.Message + "\n\n" + i18N.Translate("Missing File or runtime components"), owner: this); Netch.Application_OnException(null, new ThreadExceptionEventArgs(e)); } }); @@ -64,7 +64,7 @@ namespace Netch.Forms if (result) { State = State.Started; - _ = Task.Run(() => { Bandwidth.NetTraffic(server, mode, _mainController); }); + _ = Task.Run(() => { Bandwidth.NetTraffic(server, mode, ref _mainController); }); // 如果勾选启动后最小化 if (Global.Settings.MinimizeWhenStarted) { diff --git a/Netch/Forms/MainForm.MenuStrip.cs b/Netch/Forms/MainForm.MenuStrip.cs index 5a3bc5f6..28da224d 100644 --- a/Netch/Forms/MainForm.MenuStrip.cs +++ b/Netch/Forms/MainForm.MenuStrip.cs @@ -131,7 +131,7 @@ namespace Netch.Forms _mainController.Start(ServerComboBox.SelectedItem as Models.Server, mode); } - var mutex = new Mutex(); + var serverLock = new object(); await Task.WhenAll(Global.Settings.SubscribeLink.Select(async item => await Task.Run(async () => { @@ -154,10 +154,10 @@ namespace Netch.Forms // ignored } - mutex.WaitOne(); - Global.Settings.Server = Global.Settings.Server.Where(server => server.Group != item.Remark).ToList(); - mutex.ReleaseMutex(); - + lock (serverLock) + { + Global.Settings.Server = Global.Settings.Server.Where(server => server.Group != item.Remark).ToList(); + } var result = ShareLink.Parse(str); diff --git a/Netch/Models/Mode.cs b/Netch/Models/Mode.cs index 42ed1d09..183ff2eb 100644 --- a/Netch/Models/Mode.cs +++ b/Netch/Models/Mode.cs @@ -17,10 +17,10 @@ namespace Netch.Models /// /// 类型 - /// 0. 进程加速 - /// 1. TUN/TAP 规则内 IP CIDR 加速 - /// 2. TUN/TAP 全局,绕过规则内 IP CIDR - /// 3. HTTP 代理(自动设置到系统代理) + /// 0. Socks5 + 进程加速 + /// 1. Socks5 + TUN/TAP 规则内 IP CIDR 加速 + /// 2. Socks5 + TUN/TAP 全局,绕过规则内 IP CIDR + /// 3. Socks5 + HTTP 代理(自动设置到系统代理) /// 4. Socks5 代理(不自动设置到系统代理) /// 5. Socks5 + HTTP 代理(不自动设置到系统代理) /// diff --git a/Netch/Utils/Bandwidth.cs b/Netch/Utils/Bandwidth.cs index e1bc88d9..503d5d11 100644 --- a/Netch/Utils/Bandwidth.cs +++ b/Netch/Utils/Bandwidth.cs @@ -43,7 +43,7 @@ namespace Netch.Utils /// 根据程序名统计流量 /// /// - public static void NetTraffic(Server server, Mode mode, MainController mainController) + public static void NetTraffic(Server server, Mode mode, ref MainController mainController) { var counterLock = new object(); //int sent = 0;