using System; using System.ComponentModel; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading.Tasks; using Netch.Forms; using Netch.Models; using Netch.Utils; namespace Netch.Controllers { public class MainController { public EncryptedProxy pEncryptedProxyController; public ModeController pModeController; /// /// NTT 控制器 /// public NTTController pNTTController; [DllImport("dnsapi", EntryPoint = "DnsFlushResolverCache")] public static extern uint FlushDNSResolverCache(); /// /// 启动 /// /// 服务器 /// 模式 /// 是否启动成功 public bool Start(Server server, Mode mode) { pNTTController ??= new NTTController(); FlushDNSResolverCache(); var result = false; if (server.Type == "Socks5") { result = mode.Type != 4; } else { switch (server.Type) { case "SS": pEncryptedProxyController = new SSController(); break; case "SSR": pEncryptedProxyController = new SSRController(); break; case "VMess": pEncryptedProxyController = new VMessController(); break; case "Trojan": pEncryptedProxyController = new TrojanController(); break; } MainForm.Instance.StatusText(i18N.Translate("Starting ", pEncryptedProxyController.AkaName)); if (pEncryptedProxyController.Ready) result = pEncryptedProxyController.Start(server, mode); } if (result) { // 加密代理已启动 switch (mode.Type) { case 0: // 进程代理模式 pModeController = new NFController(); break; case 1: // TUN/TAP 黑名单代理模式 case 2: // TUN/TAP 白名单代理模式 pModeController = new TUNTAPController(); break; case 3: case 5: pModeController = new HTTPController(); break; case 4: // Socks5 代理模式,不需要启动额外的Server result = true; break; } if (pModeController != null && pModeController.Ready) { MainForm.Instance.StatusText(i18N.Translate("Starting ", pModeController.AkaName)); result = pModeController.Start(server, mode); } switch (mode.Type) { case 0: case 1: case 2: if (result) Task.Run(() => { MainForm.Instance.NatTypeStatusText(i18N.Translate("Starting NatTester")); // Thread.Sleep(1000); var (nttResult, natType, _, _) = pNTTController.Start(); if (nttResult) MainForm.Instance.NatTypeStatusText(natType); }); break; } } if (!result) Stop(); return result; } /// /// 停止 /// public void Stop() { pEncryptedProxyController?.Stop(); pModeController?.Stop(); } public static void KillProcessByName(string name) { try { foreach (var p in Process.GetProcessesByName(name)) if (p.MainModule != null && p.MainModule.FileName.StartsWith(Global.NetchDir)) p.Kill(); } catch (Win32Exception e) { Logging.Error($"结束进程 {name} 错误:\n" + e); } catch (Exception) { // ignored } } } }