修复Socks5服务器状态栏显示错误,主控制器转为静态类

This commit is contained in:
ChsBuffer
2020-08-31 16:25:17 +08:00
parent 68880f0c9b
commit 60aa010096
7 changed files with 77 additions and 77 deletions

View File

@@ -12,7 +12,7 @@ using Netch.Utils;
namespace Netch.Controllers
{
public class MainController
public static class MainController
{
/// <summary>
/// 记录当前使用的端口
@@ -20,14 +20,14 @@ namespace Netch.Controllers
/// </summary>
public static readonly List<int> UsingPorts = new List<int>();
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
/// <summary>
/// NTT 控制器
/// </summary>
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
/// <param name="server">服务器</param>
/// <param name="mode">模式</param>
/// <returns>是否启动成功</returns>
public async Task<bool> Start(Server server, Mode mode)
public static async Task<bool> 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;
/// <summary>
/// 测试 NAT
/// </summary>
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
/// <summary>
/// 停止
/// </summary>
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);
}

View File

@@ -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);
}
/// <summary>

View File

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

View File

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

View File

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

View File

@@ -16,10 +16,6 @@ namespace Netch.Forms
{
public partial class MainForm : Form
{
/// <summary>
/// 主控制器
/// </summary>
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();
}
}
}

View File

@@ -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
/// 根据程序名统计流量
/// </summary>
/// <param name="ProcessName"></param>
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<Process>();
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;
}
}