From c8f28f29f143bb0cae2d2ecca2a093d5c114a055 Mon Sep 17 00:00:00 2001 From: ChsBuffer <33744752+chsbuffer@users.noreply.github.com> Date: Wed, 8 Jul 2020 22:54:07 +0800 Subject: [PATCH] =?UTF-8?q?NAT=20=E6=8C=87=E7=A4=BA=E7=81=AF=EF=BC=8C?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E6=A0=8F=E8=87=AA=E5=8A=A8=E5=81=9C=E6=AD=A2?= =?UTF-8?q?=E5=B9=B6=E9=80=80=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Netch/Forms/MainForm.Designer.cs | 29 ++++++++++++- Netch/Forms/MainForm.MenuStrip.cs | 20 +-------- Netch/Forms/MainForm.Status.cs | 69 +++++++++++++++++++++++++------ Netch/Forms/MainForm.cs | 37 +++++++++++++++-- Netch/Models/STUN.Client.cs | 16 +++++++ 5 files changed, 135 insertions(+), 36 deletions(-) create mode 100644 Netch/Models/STUN.Client.cs diff --git a/Netch/Forms/MainForm.Designer.cs b/Netch/Forms/MainForm.Designer.cs index eda41b50..48bafdeb 100644 --- a/Netch/Forms/MainForm.Designer.cs +++ b/Netch/Forms/MainForm.Designer.cs @@ -78,7 +78,9 @@ namespace Netch.Forms this.UsedBandwidthLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.DownloadSpeedLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.UploadSpeedLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.blankToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.NatTypeStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.NatTypeStatusLightLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.ControlButton = new System.Windows.Forms.Button(); this.NotifyIcon = new System.Windows.Forms.NotifyIcon(this.components); this.NotifyMenu = new System.Windows.Forms.ContextMenuStrip(this.components); @@ -309,7 +311,7 @@ namespace Netch.Forms this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; this.exitToolStripMenuItem.Size = new System.Drawing.Size(40, 22); this.exitToolStripMenuItem.Text = "Exit"; - this.exitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripButton_Click); + this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); // // RelyToolStripMenuItem // @@ -528,7 +530,9 @@ namespace Netch.Forms this.UsedBandwidthLabel, this.DownloadSpeedLabel, this.UploadSpeedLabel, - this.NatTypeStatusLabel}); + this.blankToolStripStatusLabel, + this.NatTypeStatusLabel, + this.NatTypeStatusLightLabel}); this.StatusStrip.Location = new System.Drawing.Point(0, 250); this.StatusStrip.Name = "StatusStrip"; this.StatusStrip.Size = new System.Drawing.Size(733, 22); @@ -563,11 +567,29 @@ namespace Netch.Forms this.UploadSpeedLabel.Text = "↑: 0 KB/s"; this.UploadSpeedLabel.Visible = false; // + // blankToolStripStatusLabel + // + this.blankToolStripStatusLabel.Name = "blankToolStripStatusLabel"; + this.blankToolStripStatusLabel.Size = new System.Drawing.Size(268, 17); + this.blankToolStripStatusLabel.Spring = true; + // // NatTypeStatusLabel // this.NatTypeStatusLabel.Name = "NatTypeStatusLabel"; this.NatTypeStatusLabel.Size = new System.Drawing.Size(36, 17); this.NatTypeStatusLabel.Text = "NAT:"; + this.NatTypeStatusLabel.TextAlign = System.Drawing.ContentAlignment.BottomLeft; + // + // NatTypeStatusLightLabel + // + this.NatTypeStatusLightLabel.ActiveLinkColor = System.Drawing.Color.Red; + this.NatTypeStatusLightLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.NatTypeStatusLightLabel.ForeColor = System.Drawing.Color.Red; + this.NatTypeStatusLightLabel.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); + this.NatTypeStatusLightLabel.Name = "NatTypeStatusLightLabel"; + this.NatTypeStatusLightLabel.Size = new System.Drawing.Size(18, 21); + this.NatTypeStatusLightLabel.Text = "⬤"; + this.NatTypeStatusLightLabel.TextAlign = System.Drawing.ContentAlignment.BottomCenter; // // ControlButton // @@ -751,5 +773,8 @@ namespace Netch.Forms private System.Windows.Forms.ToolStripLabel VersionLabel; #endregion + + private System.Windows.Forms.ToolStripStatusLabel NatTypeStatusLightLabel; + private System.Windows.Forms.ToolStripStatusLabel blankToolStripStatusLabel; } } \ No newline at end of file diff --git a/Netch/Forms/MainForm.MenuStrip.cs b/Netch/Forms/MainForm.MenuStrip.cs index b344ac50..945c5e02 100644 --- a/Netch/Forms/MainForm.MenuStrip.cs +++ b/Netch/Forms/MainForm.MenuStrip.cs @@ -403,7 +403,6 @@ namespace Netch.Forms } finally { - UpdateStatus(State.Waiting); MainController.Stop(); } @@ -413,28 +412,12 @@ namespace Netch.Forms #endregion - private void ExitToolStripButton_Click(object sender, EventArgs e) + private void exitToolStripMenuItem_Click(object sender, EventArgs e) { - // 已启动 if (State != State.Waiting && State != State.Stopped) { - // 未开启自动停止 - if (!Global.Settings.StopWhenExited) - { - MessageBoxX.Show(i18N.Translate("Please press Stop button first")); - - Visible = true; - ShowInTaskbar = true; // 显示在系统任务栏 - WindowState = FormWindowState.Normal; // 还原窗体 - NotifyIcon.Visible = true; // 托盘图标隐藏 - - return; - } - // 自动停止 - ControlButton_Click(sender, e); } - SaveConfigs(); UpdateStatus(State.Terminating); @@ -490,6 +473,5 @@ namespace Netch.Forms } #endregion - } } \ No newline at end of file diff --git a/Netch/Forms/MainForm.Status.cs b/Netch/Forms/MainForm.Status.cs index fafb44b1..556e3542 100644 --- a/Netch/Forms/MainForm.Status.cs +++ b/Netch/Forms/MainForm.Status.cs @@ -1,5 +1,8 @@ -using Netch.Models; +using System; +using System.Windows.Media; +using Netch.Models; using Netch.Utils; +using Color = System.Drawing.Color; namespace Netch.Forms { @@ -19,15 +22,57 @@ namespace Netch.Forms if (State != State.Started) { NatTypeStatusLabel.Text = ""; - NatTypeStatusLabel.Visible = true; + NatTypeStatusLabel.Visible = false; + NatTypeStatusLightLabel.Visible = false; return; } + if (!string.IsNullOrEmpty(text)) + { + NatTypeStatusLabel.Text = "NAT" + i18N.Translate(": ") + text.Trim(); + } + else + { + NatTypeStatusLabel.Text = "NAT" + i18N.Translate(": ") + i18N.Translate("Test failed"); + } - NatTypeStatusLabel.Text = "NAT" + i18N.Translate(": ") + - (!string.IsNullOrEmpty(text) ? text.Trim() : i18N.Translate("Test failed")); + if (Enum.TryParse(text,false,out STUN_Client.NatType natType)) + { + UpdateNatTypeLight(natType); + NatTypeStatusLightLabel.Visible = true; + } + else + { + NatTypeStatusLightLabel.Visible = false; + } NatTypeStatusLabel.Visible = true; } + private void UpdateNatTypeLight(STUN_Client.NatType natType) + { + Color c; + switch (natType) + { + case STUN_Client.NatType.UdpBlocked: + case STUN_Client.NatType.SymmetricUdpFirewall: + case STUN_Client.NatType.Symmetric: + c = Color.Red; + break; + case STUN_Client.NatType.RestrictedCone: + case STUN_Client.NatType.PortRestrictedCone: + c = Color.Yellow; + break; + case STUN_Client.NatType.OpenInternet: + case STUN_Client.NatType.FullCone: + c = Color.LimeGreen; + break; + default: + c=Color.Red; + break; + } + NatTypeStatusLightLabel.ForeColor=c; + } + + public void StatusText(string text) { StatusLabel.Text = i18N.Translate("Status", ": ") + text; @@ -45,17 +90,17 @@ namespace Netch.Forms switch (state) { case State.Waiting: - ControlButton.Text = i18N.Translate("Start"); ControlButton.Enabled = true; - + ControlButton.Text = i18N.Translate("Start"); + MenuStrip.Enabled = ConfigurationGroupBox.Enabled = ControlButton.Enabled = SettingsButton.Enabled = true; updateACLWithProxyToolStripMenuItem.Enabled = true; - + NatTypeStatusText(); break; case State.Starting: - ControlButton.Text = "..."; ControlButton.Enabled = false; + ControlButton.Text = "..."; ServerComboBox.Enabled = false; ModeComboBox.Enabled = false; @@ -66,22 +111,22 @@ namespace Netch.Forms reinstallTapDriverToolStripMenuItem.Enabled = false; break; case State.Started: - ControlButton.Text = i18N.Translate("Stop"); ControlButton.Enabled = true; + ControlButton.Text = i18N.Translate("Stop"); break; case State.Stopping: ControlButton.Enabled = false; ControlButton.Text = "..."; - + ProfileGroupBox.Enabled = false; MenuStrip.Enabled = ConfigurationGroupBox.Enabled = SettingsButton.Enabled = true; UsedBandwidthLabel.Visible = UploadSpeedLabel.Visible = DownloadSpeedLabel.Visible = false; NatTypeStatusText(); break; case State.Stopped: - ControlButton.Text = i18N.Translate("Start"); ControlButton.Enabled = true; - + ControlButton.Text = i18N.Translate("Start"); + LastUploadBandwidth = 0; LastDownloadBandwidth = 0; diff --git a/Netch/Forms/MainForm.cs b/Netch/Forms/MainForm.cs index 16259004..bdf84468 100644 --- a/Netch/Forms/MainForm.cs +++ b/Netch/Forms/MainForm.cs @@ -72,7 +72,7 @@ namespace Netch.Forms // 加载翻译 InitText(); - + // NatTypeStatusText(); @@ -85,7 +85,7 @@ namespace Netch.Forms // 为 ComboBox绘制 收集宽度数据 _eWidth = ServerComboBox.Width / 10; - + // 自动检测延迟 Task.Run(() => { @@ -414,6 +414,37 @@ namespace Netch.Forms Activate(); } + private void ExitToolStripButton_Click(object sender, EventArgs e) + { + // 已启动 + if (State != State.Waiting && State != State.Stopped) + { + // 未开启自动停止 + if (!Global.Settings.StopWhenExited) + { + MessageBoxX.Show(i18N.Translate("Please press Stop button first")); + + Visible = true; + ShowInTaskbar = true; // 显示在系统任务栏 + WindowState = FormWindowState.Normal; // 还原窗体 + NotifyIcon.Visible = true; // 托盘图标隐藏 + + return; + } + // 自动停止 + + ControlButton_Click(sender, e); + } + + SaveConfigs(); + + UpdateStatus(State.Terminating); + NotifyIcon.Visible = false; + Close(); + Dispose(); + Environment.Exit(Environment.ExitCode); + } + private void NotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e) { if (WindowState == FormWindowState.Minimized) @@ -428,7 +459,7 @@ namespace Netch.Forms } #endregion - + #endregion } } \ No newline at end of file diff --git a/Netch/Models/STUN.Client.cs b/Netch/Models/STUN.Client.cs new file mode 100644 index 00000000..763f12f1 --- /dev/null +++ b/Netch/Models/STUN.Client.cs @@ -0,0 +1,16 @@ +namespace Netch.Models +{ + public class STUN_Client + { + public enum NatType + { + UdpBlocked, + OpenInternet, + SymmetricUdpFirewall, + FullCone, + RestrictedCone, + PortRestrictedCone, + Symmetric + } + } +} \ No newline at end of file