NetTraffic() 主控制器引用传递,补充模式注释,启动只检查需要用的端口,补充属性可访问性

This commit is contained in:
ChsBuffer
2020-08-07 22:32:01 +08:00
parent 0d1762eebe
commit 715d25a6f6
6 changed files with 59 additions and 49 deletions

View File

@@ -12,7 +12,7 @@ namespace Netch.Controllers
/// <summary>
/// 当前状态
/// </summary>
public State State { get; set; } = State.Waiting;
public State State { get; protected set; } = State.Waiting;
/// <summary>
/// 停止

View File

@@ -19,9 +19,9 @@ namespace Netch.Controllers
/// </summary>
public static readonly List<int> UsingPorts = new List<int>();
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
}
}
/// <summary>
///
/// </summary>
/// <param name="port"></param>
/// <param name="portName"></param>
/// <param name="portType"></param>
/// <returns>端口是否被占用</returns>
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;
}
}
}

View File

@@ -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)
{

View File

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

View File

@@ -17,10 +17,10 @@ namespace Netch.Models
/// <summary>
/// 类型<para />
/// 0. 进程加速<para />
/// 1. TUN/TAP 规则内 IP CIDR 加速<para />
/// 2. TUN/TAP 全局,绕过规则内 IP CIDR<para />
/// 3. HTTP 代理(自动设置到系统代理)<para />
/// 0. Socks5 + 进程加速<para />
/// 1. Socks5 + TUN/TAP 规则内 IP CIDR 加速<para />
/// 2. Socks5 + TUN/TAP 全局,绕过规则内 IP CIDR<para />
/// 3. Socks5 + HTTP 代理(自动设置到系统代理)<para />
/// 4. Socks5 代理(不自动设置到系统代理)<para />
/// 5. Socks5 + HTTP 代理(不自动设置到系统代理)<para />
/// </summary>

View File

@@ -43,7 +43,7 @@ namespace Netch.Utils
/// 根据程序名统计流量
/// </summary>
/// <param name="ProcessName"></param>
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;