Beispiel #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="portName"></param>
        /// <param name="portTextBox"></param>
        /// <param name="originPort"></param>
        /// <param name="portType"></param>
        /// <returns></returns>
        private bool CheckPortText(string portName, ref TextBox portTextBox, ref int originPort, PortType portType = PortType.Both)
        {
            // 端口检查
            try
            {
                var port = int.Parse(portTextBox.Text);

                if (port <= 0 || port >= 65536)
                {
                    throw new FormatException();
                }

                if (port == originPort)
                {
                    return(true);
                }

                if (PortHelper.PortInUse(port, portType))
                {
                    MessageBoxX.Show(i18N.TranslateFormat("The {0} port is in use.", portName));
                    return(false);
                }

                originPort = port;
            }
            catch (FormatException)
            {
                MessageBoxX.Show(i18N.Translate("Port value illegal. Try again."));
                return(false);
            }

            return(true);
        }
Beispiel #2
0
        private void btnCheckPort_Click(object sender, EventArgs e)
        {
            var port = this.tbPort.Text;

            if (port.IsNullOrWhiteSpace())
            {
                UIMessageTip.ShowError("端口号为空", 1000, true);
                return;
            }

            if (!port.IsNumeric())
            {
                UIMessageTip.ShowError("端口号只能为数字", 1000, true);
                return;
            }

            if (PortHelper.PortInUse(Convert.ToInt32(port)))
            {
                this.ShowWarningDialog($"{port}端口号已被占用");
            }
            else
            {
                this.ShowSuccessTip($"端口号:{port} 未占用");
            }
        }
Beispiel #3
0
 /// <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);
 }
Beispiel #4
0
        /// <summary>
        /// 解析数据
        /// 0,申请关闭服务
        /// 1,申请开启服务,带端口
        /// </summary>
        /// <param name="s"></param>
        public void Analysis(string s)
        {
            string[] r = s.Split(',');
            if (r[0] == "check")    //验证
            {
                if (r[1] != "1.0.1")
                {
                    ns.H_Send("fail,客户端版本过低 请更新版本");
                    connentHost.serverModels.FirstOrDefault(l => l.machineCode == r[5])?.DisClientConn();
                    machineCode = r[5];
                }
                else
                {
                    ns.H_Send("pass");
                }
            }
            else if (r[0] == "stop")    //申请关闭服务
            {
                DisClientConn();
            }
            else if (r[0] == "s_Start")    //申请开启服务
            {
                int  outPort = Convert.ToInt32(r[1]);
                bool b       = PortHelper.PortInUse(outPort);
                if (b)                                   //如果申请的端口正在使用
                {
                    ns.H_Send("s_PortOccupied," + r[4]); //拒绝
                }
                else
                {
                    ns.H_Send("s_PortAccess," + r[4]);   //同意
                    ConnentPort connentPort = new ConnentPort()
                    {
                        connentIP  = this,
                        InPort     = PortHelper.GetFirstAvailablePort(),
                        OutPort    = outPort,
                        ClientIP   = r[2],
                        ClientPort = Convert.ToInt32(r[3]),
                        ID         = r[4],
                    };
                    connentPort.Start();
                    connentPorts.Add(connentPort);
                }
            }

            else if (r[0] == "s_Stop")    //申请关闭服务
            {
                ConnentPort connentPort = connentPorts.FirstOrDefault(l => l.ID == r[1]);
                if (connentPort != null)
                {
                    connentPort.DisClientConn();
                    connentPorts.Remove(connentPort);
                }
            }
        }
Beispiel #5
0
                static void CheckPort(string portName, ushort port, ushort originPort, PortType portType = PortType.Both)
                {
                    if (port == originPort)
                    {
                        return;
                    }

                    if (PortHelper.PortInUse(port, portType))
                    {
                        MessageBoxX.Show(i18N.TranslateFormat("The {0} port is in use.", portName));
                        throw new PortInUseException();
                    }
                }
Beispiel #6
0
        private void btnSiteOK_Click(object sender, EventArgs e)
        {
            if (!this.iisManager.IsInstallIIS())
            {
                this.ShowWarningDialog("服务器尚未安装IIS服务模块");
                return;
            }
            //if (IISHelp.GetIISVersion() < 0)
            //{
            //    this.ShowWarningDialog("没有安装 IIS 环境");
            //    return;
            //}
            if (!NetFrameWorkHelp.IsExistNet40())
            {
                this.ShowWarningDialog("没有 NET4.0 环境");
                return;
            }

            Dictionary <string, string> mimeDic = new Dictionary <string, string>();

            mimeDic.Add(".woff2", "application/x-font-woff");
            mimeDic.Add(".woff", "application/x-font-woff");
            //IISHelp.AddMIMEType(mimeDic);

            var siteName = this.tbSiteName.Text;

            if (siteName.IsNullOrWhiteSpace())
            {
                this.ShowWarningDialog("应用名为空");
                return;
            }
            if (iisManager.IsExistSiteName(siteName))
            {
                this.ShowWarningDialog($"应用名:{siteName} 已被使用");
                return;
            }


            var poolName = this.tbPoolName.Text;

            if (poolName.IsNullOrWhiteSpace())
            {
                this.ShowWarningDialog("程序池名为空");
                return;
            }
            if (iisManager.IsExistPoolName(poolName))
            {
                this.ShowWarningDialog($"名称:{poolName}已被使用");
                return;
            }

            var port = this.tbPort.Text;

            if (port.IsNullOrWhiteSpace())
            {
                this.ShowWarningDialog("端口号为空");
                return;
            }
            if (!port.IsNumeric())
            {
                this.ShowWarningDialog("端口号只能为数字");
                return;
            }
            if (PortHelper.PortInUse(Convert.ToInt32(port)))
            {
                this.ShowWarningDialog($"{port}端口号已被占用");
                return;
            }


            var sitePath = this.tbSitePath.Text;

            if (sitePath.IsNullOrWhiteSpace())
            {
                this.ShowWarningDialog("应用路径不可为空");
                return;
            }
            if (!Directory.Exists(sitePath))
            {
                this.ShowWarningDialog("应用路径不存在");
                return;
            }



            var result = iisManager.CreateWebSite(siteName, poolName, sitePath, Convert.ToInt32(port), mimeDic, GetPoolMode());

            if (result)
            {
                UIMessageTip.ShowOk("发布成功", 2000, true);
            }
            else
            {
                this.ShowWarningDialog("发布失败");
            }
        }
Beispiel #7
0
        /// <summary>
        ///     启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <returns>是否启动成功</returns>
        public bool Start(Server server, Mode mode)
        {
            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;
                }

                KillProcessByName(pEncryptedProxyController.MainFile);

                // 检查端口是否被占用
                if (PortHelper.PortInUse(Global.Settings.Socks5LocalPort))
                {
                    MessageBoxX.Show(i18N.TranslateFormat("The {0} port is in use.", "Socks5"));
                    return(false);
                }

                if (PortHelper.PortInUse(Global.Settings.HTTPLocalPort))
                {
                    MessageBoxX.Show(i18N.TranslateFormat("The {0} port is in use.", "HTTP"));
                    return(false);
                }

                if (PortHelper.PortInUse(Global.Settings.RedirectorTCPPort, PortType.TCP))
                {
                    MessageBoxX.Show(i18N.TranslateFormat("The {0} port is in use.", "Redirector TCP"));
                    return(false);
                }

                Global.MainForm.StatusText(i18N.Translate("Starting ", pEncryptedProxyController.Name));
                result = pEncryptedProxyController.Start(server, mode);
            }

            if (result)
            {
                Logging.Info("加密代理已启动");
                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)
                {
                    Global.MainForm.StatusText(i18N.Translate("Starting ", pModeController.Name));
                    result = pModeController.Start(server, mode);
                }

                if (result)
                {
                    switch (mode.Type)
                    {
                    case 0:
                    case 1:
                    case 2:
                        Task.Run(() =>
                        {
                            Global.MainForm.NatTypeStatusText(i18N.Translate("Starting NatTester"));
                            // Thread.Sleep(1000);
                            var(nttResult, natType, localEnd, publicEnd) = pNTTController.Start();
                            var country = Utils.Utils.GetCityCode(publicEnd);

                            if (nttResult)
                            {
                                Global.MainForm.NatTypeStatusText(natType, country);
                            }
                        });
                        break;
                    }
                }
            }

            if (!result)
            {
                Stop();
            }

            return(result);
        }
Beispiel #8
0
        /// <summary>
        ///     启动
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="mode">模式</param>
        /// <returns>是否启动成功</returns>
        public 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;
            _redirectorTCPPort = Global.Settings.RedirectorTCPPort;
            _localAddress      = Global.Settings.LocalAddress;
            _savedServer       = server;
            _savedMode         = mode;

            #endregion

            FlushDNSResolverCache();

            bool result;
            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;
                }

                KillProcessByName(pEncryptedProxyController.MainFile);

                // 检查端口是否被占用
                if (PortHelper.PortInUse(Global.Settings.Socks5LocalPort))
                {
                    MessageBoxX.Show(i18N.TranslateFormat("The {0} port is in use.", "Socks5"));
                    return(false);
                }

                if (PortHelper.PortInUse(Global.Settings.HTTPLocalPort))
                {
                    MessageBoxX.Show(i18N.TranslateFormat("The {0} port is in use.", "HTTP"));
                    return(false);
                }

                if (PortHelper.PortInUse(Global.Settings.RedirectorTCPPort, PortType.TCP))
                {
                    MessageBoxX.Show(i18N.TranslateFormat("The {0} port is in use.", "Redirector TCP"));
                    return(false);
                }

                Global.MainForm.StatusText(i18N.Translate("Starting ", pEncryptedProxyController.Name));
                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)
                {
                    Global.MainForm.StatusText(i18N.Translate("Starting ", pModeController.Name));
                    result = pModeController.Start(server, mode);
                }

                if (result)
                {
                    #region Add UsingPorts

                    switch (mode.Type)
                    {
                    // 成功启动
                    case 3:
                    case 5:
                        UsingPorts.Add(Global.Settings.HTTPLocalPort);
                        break;

                    case 0:
                        UsingPorts.Add(Global.Settings.RedirectorTCPPort);
                        break;
                    }

                    if (server.Type != "Socks5")
                    {
                        UsingPorts.Add(Global.Settings.Socks5LocalPort);
                    }

                    #endregion

                    switch (mode.Type)
                    {
                    case 0:
                    case 1:
                    case 2:
                        Task.Run(() =>
                        {
                            Global.MainForm.NatTypeStatusText(i18N.Translate("Starting NatTester"));
                            // Thread.Sleep(1000);
                            var(nttResult, natType, localEnd, publicEnd) = pNTTController.Start();
                            var country = Utils.Utils.GetCityCode(publicEnd);

                            if (nttResult)
                            {
                                Global.MainForm.NatTypeStatusText(natType, country);
                            }
                        });
                        break;
                    }
                }
            }

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

            return(result);
        }
Beispiel #9
0
        private void ControlFun()
        {
            //防止模式选择框变成蓝色:D
            ModeComboBox.Select(0, 0);

            if (State == State.Waiting || State == State.Stopped)
            {
                #region  务器、模式 需选择
                if (ServerComboBox.SelectedIndex == -1)
                {
                    MessageBoxX.Show(i18N.Translate("Please select a server first"));
                    return;
                }

                if (ModeComboBox.SelectedIndex == -1)
                {
                    MessageBoxX.Show(i18N.Translate("Please select an mode first"));
                    return;
                }
                #endregion

                #region 检查端口是否被占用
                if (PortHelper.PortInUse(Global.Settings.Socks5LocalPort))
                {
                    MessageBoxX.Show("The Socks5 port is in use. Click OK to modify it.");
                    SettingsButton.PerformClick();
                    return;
                }

                if (PortHelper.PortInUse(Global.Settings.HTTPLocalPort))
                {
                    MessageBoxX.Show("The HTTP port is in use. Click OK to modify it.");
                    SettingsButton.PerformClick();
                    return;
                }

                if (PortHelper.PortInUse(Global.Settings.RedirectorTCPPort, PortType.TCP))
                {
                    MessageBoxX.Show("The RedirectorTCP port is in use. Click OK to modify it.");
                    SettingsButton.PerformClick();
                    return;
                }
                #endregion

                UpdateStatus(State.Starting);

                Task.Run(() =>
                {
                    Task.Run(Firewall.AddNetchFwRules);

                    var server = ServerComboBox.SelectedItem as Models.Server;
                    var mode   = ModeComboBox.SelectedItem as Models.Mode;

                    if (_mainController.Start(server, mode))
                    {
                        Task.Run(() =>
                        {
                            UpdateStatus(State.Started,
                                         i18N.Translate(StateExtension.GetStatusString(State.Started)) + PortText(server.Type, mode.Type));

                            Bandwidth.NetTraffic(server, mode, _mainController);
                        });

                        // 如果勾选启动后最小化
                        if (Global.Settings.MinimizeWhenStarted)
                        {
                            WindowState        = FormWindowState.Minimized;
                            NotifyIcon.Visible = true;

                            if (_isFirstCloseWindow)
                            {
                                // 显示提示语
                                NotifyIcon.ShowBalloonTip(5,
                                                          UpdateChecker.Name,
                                                          i18N.Translate(
                                                              "Netch is now minimized to the notification bar, double click this icon to restore."),
                                                          ToolTipIcon.Info);

                                _isFirstCloseWindow = false;
                            }

                            Hide();
                        }

                        if (Global.Settings.StartedTcping)
                        {
                            // 自动检测延迟
                            Task.Run(() =>
                            {
                                while (true)
                                {
                                    if (State == State.Started)
                                    {
                                        server.Test();
                                        // 重载服务器列表
                                        InitServer();

                                        Thread.Sleep(Global.Settings.StartedTcping_Interval * 1000);
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            });
                        }
                    }
                    else
                    {
                        UpdateStatus(State.Stopped, i18N.Translate("Start failed"));
                    }
                });
            }
            else
            {
                // 停止
                UpdateStatus(State.Stopping);
                Task.Run(() =>
                {
                    _mainController.Stop();
                    UpdateStatus(State.Stopped);

                    TestServer();
                });
            }
        }
Beispiel #10
0
        private void ControlButton_Click(object sender, EventArgs e)
        {
            Global.Settings.ExitWhenClosed         = ExitWhenClosedCheckBox.Checked;
            Global.Settings.StopWhenExited         = StopWhenExitedCheckBox.Checked;
            Global.Settings.StartWhenOpened        = StartWhenOpenedCheckBox.Checked;
            Global.Settings.CheckUpdateWhenOpened  = CheckUpdateWhenOpenedCheckBox.Checked;
            Global.Settings.MinimizeWhenStarted    = MinimizeWhenStartedCheckBox.Checked;
            Global.Settings.RunAtStartup           = RunAtStartup.Checked;
            Global.Settings.BootShadowsocksFromDLL = BootShadowsocksFromDLLCheckBox.Checked;
            Global.Settings.Language = LanguageComboBox.SelectedItem.ToString();

            // 开机自启判断
            var scheduler = new TaskSchedulerClass();

            scheduler.Connect();
            var folder       = scheduler.GetFolder("\\");
            var taskIsExists = false;

            try
            {
                folder.GetTask("Netch Startup");
                taskIsExists = true;
            }
            catch (Exception) { }

            if (RunAtStartup.Checked)
            {
                if (taskIsExists)
                {
                    folder.DeleteTask("Netch Startup", 0);
                }

                var task = scheduler.NewTask(0);
                task.RegistrationInfo.Author      = "Netch";
                task.RegistrationInfo.Description = "Netch run at startup.";
                task.Principal.RunLevel           = _TASK_RUNLEVEL.TASK_RUNLEVEL_HIGHEST;

                task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_LOGON);
                var action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);
                action.Path = Application.ExecutablePath;


                task.Settings.ExecutionTimeLimit         = "PT0S";
                task.Settings.DisallowStartIfOnBatteries = false;
                task.Settings.RunOnlyIfIdle = false;

                folder.RegisterTaskDefinition("Netch Startup", task, (int)_TASK_CREATION.TASK_CREATE, null, null, _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, "");
            }
            else
            {
                if (taskIsExists)
                {
                    folder.DeleteTask("Netch Startup", 0);
                }
            }

            try
            {
                var Socks5Port = int.Parse(Socks5PortTextBox.Text);

                if (Socks5Port > 0 && Socks5Port < 65536)
                {
                    Global.Settings.Socks5LocalPort = Socks5Port;
                }
                else
                {
                    throw new FormatException();
                }
            }
            catch (FormatException)
            {
                Socks5PortTextBox.Text = Global.Settings.Socks5LocalPort.ToString();
                MessageBoxX.Show(i18N.Translate("Port value illegal. Try again."));

                return;
            }

            try
            {
                var HTTPPort = int.Parse(HTTPPortTextBox.Text);

                if (HTTPPort > 0 && HTTPPort < 65536)
                {
                    Global.Settings.HTTPLocalPort = HTTPPort;
                }
                else
                {
                    throw new FormatException();
                }
            }
            catch (FormatException)
            {
                HTTPPortTextBox.Text = Global.Settings.HTTPLocalPort.ToString();
                MessageBoxX.Show(i18N.Translate("Port value illegal. Try again."));

                return;
            }

            try
            {
                var RedirectorPort = int.Parse(RedirectorTextBox.Text);

                if (RedirectorPort > 0 && RedirectorPort < 65536)
                {
                    Global.Settings.RedirectorTCPPort = RedirectorPort;
                }
                else
                {
                    throw new FormatException();
                }
            }
            catch (FormatException)
            {
                RedirectorTextBox.Text = Global.Settings.RedirectorTCPPort.ToString();
                MessageBoxX.Show(i18N.Translate("Port value illegal. Try again."));

                return;
            }

            if (AllowDevicesCheckBox.Checked)
            {
                Global.Settings.LocalAddress = "0.0.0.0";
            }
            else
            {
                Global.Settings.LocalAddress = "127.0.0.1";
            }

            try
            {
                var Address = IPAddress.Parse(TUNTAPAddressTextBox.Text);
                var Netmask = IPAddress.Parse(TUNTAPNetmaskTextBox.Text);
                var Gateway = IPAddress.Parse(TUNTAPGatewayTextBox.Text);

                var DNS = new List <IPAddress>();
                foreach (var ip in TUNTAPDNSTextBox.Text.Split(','))
                {
                    DNS.Add(IPAddress.Parse(ip));
                }
            }
            catch (FormatException)
            {
                MessageBoxX.Show(i18N.Translate("IP address format illegal. Try again."));

                TUNTAPAddressTextBox.Text = Global.Settings.TUNTAP.Address;
                TUNTAPNetmaskTextBox.Text = Global.Settings.TUNTAP.Netmask;
                TUNTAPGatewayTextBox.Text = Global.Settings.TUNTAP.Gateway;

                var DNS = "";
                foreach (var ip in Global.Settings.TUNTAP.DNS)
                {
                    DNS += ip;
                    DNS += ',';
                }
                DNS = DNS.Trim();
                TUNTAPDNSTextBox.Text        = DNS.Substring(0, DNS.Length - 1);
                UseCustomDNSCheckBox.Checked = Global.Settings.TUNTAP.UseCustomDNS;

                return;
            }
            try
            {
                var ProfileCount = int.Parse(ProfileCount_TextBox.Text);

                if (ProfileCount > -1)
                {
                    Global.Settings.ProfileCount = ProfileCount;
                }
                else
                {
                    throw new FormatException();
                }
            }
            catch (FormatException)
            {
                ProfileCount_TextBox.Text = Global.Settings.ProfileCount.ToString();
                MessageBoxX.Show(i18N.Translate("ProfileCount value illegal. Try again."));

                return;
            }
            try
            {
                var STUN_Server = STUN_ServerTextBox.Text;
                Global.Settings.STUN_Server = STUN_Server;

                var STUN_ServerPort = int.Parse(STUN_ServerPortTextBox.Text);

                if (STUN_ServerPort > 0)
                {
                    Global.Settings.STUN_Server_Port = STUN_ServerPort;
                }
                else
                {
                    throw new FormatException();
                }
            }
            catch (FormatException)
            {
                ProfileCount_TextBox.Text = Global.Settings.ProfileCount.ToString();
                MessageBoxX.Show(i18N.Translate("STUN_ServerPort value illegal. Try again."));

                return;
            }
            try
            {
                Global.Settings.StartedTcping = EnableStartedTcping_CheckBox.Checked;

                var DetectionInterval = int.Parse(DetectionInterval_TextBox.Text);

                if (DetectionInterval > 0)
                {
                    Global.Settings.StartedTcping_Interval = DetectionInterval;
                }
                else
                {
                    throw new FormatException();
                }
            }
            catch (FormatException)
            {
                ProfileCount_TextBox.Text = Global.Settings.ProfileCount.ToString();
                MessageBoxX.Show(i18N.Translate("Detection interval value illegal. Try again."));

                return;
            }

            Global.Settings.ACL = AclAddr.Text;

            Global.Settings.TUNTAP.Address = TUNTAPAddressTextBox.Text;
            Global.Settings.TUNTAP.Netmask = TUNTAPNetmaskTextBox.Text;
            Global.Settings.TUNTAP.Gateway = TUNTAPGatewayTextBox.Text;

            Global.Settings.TUNTAP.DNS.Clear();
            foreach (var ip in TUNTAPDNSTextBox.Text.Split(','))
            {
                Global.Settings.TUNTAP.DNS.Add(ip);
            }

            Global.Settings.TUNTAP.UseCustomDNS = UseCustomDNSCheckBox.Checked;
            Global.Settings.TUNTAP.ProxyDNS     = ProxyDNSCheckBox.Checked;
            Global.Settings.TUNTAP.UseFakeDNS   = UseFakeDNSCheckBox.Checked;

            #region 检查端口是否被占用
            if (PortHelper.PortInUse(Global.Settings.Socks5LocalPort))
            {
                MessageBoxX.Show("The Socks5 port is in use. Please reset.");
                return;
            }

            if (PortHelper.PortInUse(Global.Settings.HTTPLocalPort))
            {
                MessageBoxX.Show("The HTTP port is in use. Please reset.");
                return;
            }

            if (PortHelper.PortInUse(Global.Settings.RedirectorTCPPort, PortType.TCP))
            {
                MessageBoxX.Show("The RedirectorTCP port is in use. Please reset.");
                return;
            }
            #endregion

            Configuration.Save();
            MessageBoxX.Show(i18N.Translate("Saved"));
            Close();
        }