Ejemplo n.º 1
0
        /// <summary>
        ///     停止
        /// </summary>
        public static async Task Stop()
        {
            UsingPorts.Clear();

            _ = Task.Run(() => NTTController.Stop());

            var tasks = new[]
            {
                Task.Run(() => EncryptedProxyController?.Stop()),
                Task.Run(() => ModeController?.Stop()),
            };
            await Task.WhenAll(tasks);
        }
Ejemplo n.º 2
0
        /// <summary>
        ///     停止
        /// </summary>
        public static async Task Stop()
        {
            _httpPort     = _socks5Port = _redirectorTCPPort = 0;
            _localAddress = null;
            _savedMode    = null;
            _savedServer  = null;
            UsingPorts.Clear();

            var tasks = new Task[]
            {
                Task.Run(() => EncryptedProxyController?.Stop()),
                Task.Run(() => ModeController?.Stop()),
                Task.Run(() => NTTController.Stop())
            };
            await Task.WhenAll(tasks);
        }
Ejemplo n.º 3
0
        /// <summary>
        ///     启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <returns>是否启动成功</returns>
        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        = server.Type != "Socks5" ? Global.Settings.Socks5LocalPort : server.Port;
            _redirectorTCPPort = Global.Settings.RedirectorTCPPort;
            _localAddress      = server.Type != "Socks5" ? Global.Settings.LocalAddress : "127.0.0.1";
            _savedServer       = server;
            _savedMode         = mode;

            #endregion

            FlushDNSResolverCache();
            _ = Task.Run(Firewall.AddNetchFwRules);

            bool result;
            if (server.Type == "Socks5")
            {
                result = mode.Type != 4;
            }
            else
            {
                EncryptedProxyController = server.Type switch
                {
                    "SS" => new SSController(),
                    "SSR" => new SSRController(),
                    "VMess" => new VMessController(),
                    "Trojan" => new TrojanController(),
                    _ => EncryptedProxyController
                };

                KillProcessByName(EncryptedProxyController.MainFile);

                #region 检查端口是否被占用

                var portNotAvailable = false;
                if (_savedServer.Type != "Socks5")
                {
                    portNotAvailable |= PortCheckAndShowMessageBox(_socks5Port, "Socks5");
                }

                switch (_savedMode.Type)
                {
                case 0:
                    portNotAvailable |= PortCheckAndShowMessageBox(_redirectorTCPPort, "Redirector TCP");
                    break;

                case 3:
                case 5:
                    portNotAvailable |= PortCheckAndShowMessageBox(_httpPort, "HTTP");
                    break;
                }

                if (portNotAvailable)
                {
                    Logging.Error("主控制器启动失败: 端口被占用");
                    return(false);
                }

                #endregion

                Global.MainForm.StatusText(i18N.Translate("Starting ", EncryptedProxyController.Name));
                try
                {
                    result = await Task.Run(() => EncryptedProxyController.Start(server, mode));
                }
                catch (Exception e)
                {
                    Logging.Error("加密代理启动失败,未处理异常: " + e);
                    result = false;
                }
            }

            if (result)
            {
                // 加密代理成功启动
                UsingPorts.Add(_socks5Port);

                switch (mode.Type)
                {
                case 0:     // 进程代理模式
                    ModeController = new NFController();
                    break;

                case 1:     // TUN/TAP 黑名单代理模式
                case 2:     // TUN/TAP 白名单代理模式
                    ModeController = new TUNTAPController();
                    break;

                case 3:
                case 5:
                    ModeController = new HTTPController();
                    break;

                case 4:     // Socks5 代理模式,不需要启动额外的Server
                    result = true;
                    break;
                }

                if (ModeController != null)
                {
                    Global.MainForm.StatusText(i18N.Translate("Starting ", ModeController.Name));
                    try
                    {
                        result = await Task.Run(() => ModeController.Start(server, mode));
                    }
                    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);
                        }
                        else
                        {
                            Logging.Error("模式启动失败,未处理异常: " + e);
                        }
                        result = false;
                    }
                }

                if (result)
                {
                    // 成功启动

                    switch (mode.Type) // 记录使用端口
                    {
                    case 0:
                        UsingPorts.Add(_redirectorTCPPort);
                        break;

                    case 3:
                    case 5:
                        UsingPorts.Add(_httpPort);
                        break;
                    }

                    switch (mode.Type)
                    {
                    case 0:
                    case 1:
                    case 2:
                        NatTest();
                        break;
                    }
                }
            }

            if (!result)
            {
                Logging.Error("主控制器启动失败");
                try
                {
                    await Stop();
                }
                catch
                {
                    // ignored
                }
            }

            return(result);
        }