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;
}
}