/// <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); }
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} 未占用"); } }
/// <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); }
/// <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); } } }
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(); } }
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("发布失败"); } }
/// <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); }
/// <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); }
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(); }); } }
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(); }