mirror of
https://github.com/netchx/netch.git
synced 2026-05-01 22:19:37 +08:00
修复Socks5服务器状态栏显示错误,主控制器转为静态类
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user