diff --git a/Netch/Controllers/MainController.cs b/Netch/Controllers/MainController.cs index eae40dfb..c378b588 100644 --- a/Netch/Controllers/MainController.cs +++ b/Netch/Controllers/MainController.cs @@ -12,7 +12,7 @@ using Netch.Utils; namespace Netch.Controllers { - public class MainController + public static class MainController { /// /// 记录当前使用的端口 @@ -20,14 +20,14 @@ namespace Netch.Controllers /// public static readonly List UsingPorts = new List(); - public EncryptedProxy pEncryptedProxyController { get; private set; } + public static EncryptedProxy EncryptedProxyController { get; private set; } - public ModeController pModeController { get; private set; } + public static ModeController ModeController { get; private set; } - private Server _savedServer; - private Mode _savedMode; + private static Server _savedServer; + private static Mode _savedMode; - public string PortInfo + public static string PortInfo { get { @@ -48,7 +48,11 @@ namespace Netch.Controllers if (_savedMode.Type == 3 || _savedMode.Type == 5) // 有HTTP - text.Append($" | HTTP {i18N.Translate("Local Port", ": ")}{_httpPort}"); + { + if (_savedServer.Type != "Socks5") + text.Append(" | "); + text.Append($"HTTP {i18N.Translate("Local Port", ": ")}{_httpPort}"); + } return $" ({text})"; } @@ -57,12 +61,13 @@ namespace Netch.Controllers /// /// NTT 控制器 /// - public NTTController pNTTController = new NTTController(); + public static readonly NTTController NTTController = new NTTController(); + + private static string _localAddress; + private static int _redirectorTCPPort; + private static int _httpPort; + private static int _socks5Port; - private string _localAddress; - private int _redirectorTCPPort; - private int _httpPort; - private int _socks5Port; [DllImport("dnsapi", EntryPoint = "DnsFlushResolverCache")] public static extern uint FlushDNSResolverCache(); @@ -73,16 +78,16 @@ namespace Netch.Controllers /// 服务器 /// 模式 /// 是否启动成功 - public async Task Start(Server server, Mode mode) + public static async Task Start(Server server, Mode mode) { Logging.Info($"启动主控制器: {server.Type} [{mode.Type}]{mode.Remark}"); #region Record Settings _httpPort = Global.Settings.HTTPLocalPort; - _socks5Port = Global.Settings.Socks5LocalPort; + _socks5Port = server.Type != "Socks5" ? Global.Settings.Socks5LocalPort : server.Port; _redirectorTCPPort = Global.Settings.RedirectorTCPPort; - _localAddress = Global.Settings.LocalAddress; + _localAddress = server.Type != "Socks5" ? Global.Settings.LocalAddress : "127.0.0.1"; _savedServer = server; _savedMode = mode; @@ -98,45 +103,48 @@ namespace Netch.Controllers } else { - pEncryptedProxyController = server.Type switch + EncryptedProxyController = server.Type switch { "SS" => new SSController(), "SSR" => new SSRController(), "VMess" => new VMessController(), "Trojan" => new TrojanController(), - _ => pEncryptedProxyController + _ => EncryptedProxyController }; - KillProcessByName(pEncryptedProxyController.MainFile); + KillProcessByName(EncryptedProxyController.MainFile); - // 检查端口是否被占用 - var isPortNotAvailable = false; + #region 检查端口是否被占用 + + var portNotAvailable = false; if (_savedServer.Type != "Socks5") { - isPortNotAvailable |= PortCheckAndShowMessageBox(_socks5Port, "Socks5"); + portNotAvailable |= PortCheckAndShowMessageBox(_socks5Port, "Socks5"); } switch (_savedMode.Type) { case 0: - isPortNotAvailable |= PortCheckAndShowMessageBox(_redirectorTCPPort, "Redirector TCP"); + portNotAvailable |= PortCheckAndShowMessageBox(_redirectorTCPPort, "Redirector TCP"); break; case 3: case 5: - isPortNotAvailable |= PortCheckAndShowMessageBox(_httpPort, "HTTP"); + portNotAvailable |= PortCheckAndShowMessageBox(_httpPort, "HTTP"); break; } - if (isPortNotAvailable) + if (portNotAvailable) { Logging.Error("主控制器启动失败: 端口被占用"); return false; } - Global.MainForm.StatusText(i18N.Translate("Starting ", pEncryptedProxyController.Name)); + #endregion + + Global.MainForm.StatusText(i18N.Translate("Starting ", EncryptedProxyController.Name)); try { - result = await Task.Run(() => pEncryptedProxyController.Start(server, mode)); + result = await Task.Run(() => EncryptedProxyController.Start(server, mode)); } catch (Exception e) { @@ -148,32 +156,32 @@ namespace Netch.Controllers if (result) { // 加密代理成功启动 - UsingPorts.Add(pEncryptedProxyController?.Socks5LocalPort ?? server.Port); // 记录Socks5使用端口 + UsingPorts.Add(_socks5Port); switch (mode.Type) { case 0: // 进程代理模式 - pModeController = new NFController(); + ModeController = new NFController(); break; case 1: // TUN/TAP 黑名单代理模式 case 2: // TUN/TAP 白名单代理模式 - pModeController = new TUNTAPController(); + ModeController = new TUNTAPController(); break; case 3: case 5: - pModeController = new HTTPController(); + ModeController = new HTTPController(); break; case 4: // Socks5 代理模式,不需要启动额外的Server result = true; break; } - if (pModeController != null) + if (ModeController != null) { - Global.MainForm.StatusText(i18N.Translate("Starting ", pModeController.Name)); + Global.MainForm.StatusText(i18N.Translate("Starting ", ModeController.Name)); try { - result = await Task.Run(() => pModeController.Start(server, mode)); + result = await Task.Run(() => ModeController.Start(server, mode)); } catch (Exception e) { @@ -227,19 +235,19 @@ namespace Netch.Controllers return result; } - public bool NttTested; + public static bool NttTested; /// /// 测试 NAT /// - public void NatTest() + public static void NatTest() { NttTested = false; Task.Run(() => { Global.MainForm.NatTypeStatusText(i18N.Translate("Starting NatTester")); // Thread.Sleep(1000); - var (nttResult, natType, localEnd, publicEnd) = pNTTController.Start(); + var (nttResult, natType, localEnd, publicEnd) = NTTController.Start(); if (nttResult) { @@ -256,14 +264,19 @@ namespace Netch.Controllers /// /// 停止 /// - public async Task Stop() + public static async Task Stop() { + _httpPort = _socks5Port = _redirectorTCPPort = 0; + _localAddress = null; + _savedMode = null; + _savedServer = null; + UsingPorts.Clear(); + var tasks = new Task[] { - Task.Run(() => pEncryptedProxyController?.Stop()), - Task.Run(() => UsingPorts.Clear()), - Task.Run(() => pModeController?.Stop()), - Task.Run(() => pNTTController.Stop()) + Task.Run(() => EncryptedProxyController?.Stop()), + Task.Run(() => ModeController?.Stop()), + Task.Run(() => NTTController.Stop()) }; await Task.WhenAll(tasks); } diff --git a/Netch/Controllers/Mode/TUNTAPController.cs b/Netch/Controllers/Mode/TUNTAPController.cs index e95327b4..2867d7bf 100644 --- a/Netch/Controllers/Mode/TUNTAPController.cs +++ b/Netch/Controllers/Mode/TUNTAPController.cs @@ -204,14 +204,7 @@ namespace Netch.Controllers //if (Global.Settings.TUNTAP.UseCustomDNS || server.Type.Equals("VMess")) if (Global.Settings.TUNTAP.UseCustomDNS) { - dns = string.Empty; - foreach (var value in Global.Settings.TUNTAP.DNS) - { - dns += value; - dns += ','; - } - - dns = dns.Trim(); + dns = Global.Settings.TUNTAP.DNS.Aggregate(string.Empty, (current, value) => current + (value + ',')).Trim(); dns = dns.Substring(0, dns.Length - 1); } else @@ -231,8 +224,7 @@ namespace Netch.Controllers argument.Append($"-tunAddr {Global.Settings.TUNTAP.Address} -tunMask {Global.Settings.TUNTAP.Netmask} -tunGw {Global.Settings.TUNTAP.Gateway} -tunDns {dns} -tunName \"{adapterName}\""); State = State.Starting; - if (!StartInstanceAuto(argument.ToString(), ProcessPriorityClass.RealTime)) return false; - return true; + return StartInstanceAuto(argument.ToString(), ProcessPriorityClass.RealTime); } /// diff --git a/Netch/Forms/MainForm.Control.cs b/Netch/Forms/MainForm.Control.cs index 2f47f202..df342587 100644 --- a/Netch/Forms/MainForm.Control.cs +++ b/Netch/Forms/MainForm.Control.cs @@ -4,6 +4,7 @@ using System.Numerics; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using Netch.Controllers; using Netch.Models; using Netch.Utils; @@ -43,10 +44,10 @@ namespace Netch.Forms var server = ServerComboBox.SelectedItem as Models.Server; var mode = ModeComboBox.SelectedItem as Models.Mode; - if (await _mainController.Start(server, mode)) + if (await MainController.Start(server, mode)) { State = State.Started; - _ = Task.Run(() => { Bandwidth.NetTraffic(server, mode, ref _mainController); }); + _ = Task.Run(() => { Bandwidth.NetTraffic(server, mode); }); // 如果勾选启动后最小化 if (Global.Settings.MinimizeWhenStarted) { @@ -88,7 +89,7 @@ namespace Netch.Forms { // 停止 State = State.Stopping; - await _mainController.Stop(); + await MainController.Stop(); State = State.Stopped; _ = Task.Run(TestServer); } diff --git a/Netch/Forms/MainForm.MenuStrip.cs b/Netch/Forms/MainForm.MenuStrip.cs index 7e6e9b62..12490818 100644 --- a/Netch/Forms/MainForm.MenuStrip.cs +++ b/Netch/Forms/MainForm.MenuStrip.cs @@ -144,7 +144,7 @@ namespace Netch.Forms Remark = "ProxyUpdate", Type = 5 }; - await _mainController.Start(ServerComboBox.SelectedItem as Models.Server, mode); + await MainController.Start(ServerComboBox.SelectedItem as Models.Server, mode); } var serverLock = new object(); @@ -209,7 +209,7 @@ namespace Netch.Forms { if (Global.Settings.UseProxyToUpdateSubscription) { - await _mainController.Stop(); + await MainController.Stop(); } DisableItems(true); @@ -297,7 +297,7 @@ namespace Netch.Forms Type = 5 }; State = State.Starting; - await _mainController.Start(ServerComboBox.SelectedItem as Models.Server, mode); + await MainController.Start(ServerComboBox.SelectedItem as Models.Server, mode); } var req = WebUtil.CreateRequest(Global.Settings.ACL); @@ -316,7 +316,7 @@ namespace Netch.Forms { if (useProxy) { - await _mainController.Stop(); + await MainController.Stop(); State = State.Stopped; } diff --git a/Netch/Forms/MainForm.Status.cs b/Netch/Forms/MainForm.Status.cs index c6744de2..5b3c405c 100644 --- a/Netch/Forms/MainForm.Status.cs +++ b/Netch/Forms/MainForm.Status.cs @@ -2,6 +2,7 @@ using System.Drawing; using System.Threading; using System.Windows; +using Netch.Controllers; using Netch.Models; using Netch.Utils; @@ -68,7 +69,7 @@ namespace Netch.Forms ControlButton.Enabled = true; ControlButton.Text = i18N.Translate("Stop"); - StatusTextAppend(_mainController.PortInfo); + StatusTextAppend(MainController.PortInfo); ProfileGroupBox.Enabled = true; diff --git a/Netch/Forms/MainForm.cs b/Netch/Forms/MainForm.cs index 1a05d663..b4b99427 100644 --- a/Netch/Forms/MainForm.cs +++ b/Netch/Forms/MainForm.cs @@ -16,10 +16,6 @@ namespace Netch.Forms { public partial class MainForm : Form { - /// - /// 主控制器 - /// - private MainController _mainController = new MainController(); public MainForm() { @@ -444,9 +440,9 @@ namespace Netch.Forms private void NatTypeStatusLabel_Click(object sender, EventArgs e) { - if (_state == State.Started && _mainController.NttTested) + if (_state == State.Started && MainController.NttTested) { - _mainController.NatTest(); + MainController.NatTest(); } } } diff --git a/Netch/Utils/Bandwidth.cs b/Netch/Utils/Bandwidth.cs index 20bc8d1e..2b830ef2 100644 --- a/Netch/Utils/Bandwidth.cs +++ b/Netch/Utils/Bandwidth.cs @@ -1,13 +1,10 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; -using System.Numerics; using System.Threading.Tasks; using Microsoft.Diagnostics.Tracing.Parsers; using Microsoft.Diagnostics.Tracing.Session; using Netch.Controllers; -using Netch.Forms; using Netch.Models; namespace Netch.Utils @@ -55,29 +52,29 @@ namespace Netch.Utils /// 根据程序名统计流量 /// /// - public static void NetTraffic(Server server, Mode mode, ref MainController mainController) + public static void NetTraffic(Server server, Mode mode) { var counterLock = new object(); //int sent = 0; //var processList = Process.GetProcessesByName(ProcessName).Select(p => p.Id).ToHashSet(); var instances = new List(); - if (server.Type.Equals("Socks5") && mainController.pModeController.Name == "HTTP") + if (server.Type.Equals("Socks5") && MainController.ModeController.Name == "HTTP") { - instances.Add(((HTTPController) mainController.pModeController).pPrivoxyController.Instance); + instances.Add(((HTTPController) MainController.ModeController).pPrivoxyController.Instance); } else if (server.Type.Equals("SS") && Global.Settings.BootShadowsocksFromDLL && (mode.Type == 0 || mode.Type == 1 || mode.Type == 2)) { instances.Add(Process.GetCurrentProcess()); } - else if (mainController.pEncryptedProxyController != null) + else if (MainController.EncryptedProxyController != null) { - instances.Add(mainController.pEncryptedProxyController.Instance); + instances.Add(MainController.EncryptedProxyController.Instance); } - else if (mainController.pModeController != null) + else if (MainController.ModeController != null) { - instances.Add(mainController.pModeController.Instance); + instances.Add(MainController.ModeController.Instance); } var processList = instances.Select(instance => instance.Id).ToList(); @@ -127,7 +124,7 @@ namespace Netch.Utils public static void Stop() { - if (tSession != null) tSession.Dispose(); + tSession?.Dispose(); received = 0; } }