diff --git a/Netch/Controllers/UpdateChecker.cs b/Netch/Controllers/UpdateChecker.cs
index c9c30d76..8770d2ed 100644
--- a/Netch/Controllers/UpdateChecker.cs
+++ b/Netch/Controllers/UpdateChecker.cs
@@ -14,8 +14,8 @@ namespace Netch.Controllers
private const int DefaultGetTimeout = 30000;
- private const string Owner = @"NetchX";
- private const string Repo = @"Netch";
+ public const string Owner = @"NetchX";
+ public const string Repo = @"Netch";
public string LatestVersionNumber;
public string LatestVersionUrl;
@@ -26,7 +26,7 @@ namespace Netch.Controllers
public const string Name = @"Netch";
public const string Copyright = @"Copyright © 2019 - 2020";
- public const string Version = @"1.4.10";
+ public const string Version = @"1.4.11";
public async void Check(bool notifyNoFound, bool isPreRelease)
{
diff --git a/Netch/Forms/MainForm.Designer.cs b/Netch/Forms/MainForm.Designer.cs
index 466b3bee..feb7f45a 100644
--- a/Netch/Forms/MainForm.Designer.cs
+++ b/Netch/Forms/MainForm.Designer.cs
@@ -39,6 +39,7 @@ namespace Netch.Forms
this.AddShadowsocksServerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.AddShadowsocksRServerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.AddVMessServerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.AddTrojanServerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.CreateProcessModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ManageProcessModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -56,6 +57,7 @@ namespace Netch.Forms
this.AboutToolStripButton = new System.Windows.Forms.ToolStripButton();
this.VersionLabel = new System.Windows.Forms.ToolStripLabel();
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.RelyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ConfigurationGroupBox = new System.Windows.Forms.GroupBox();
this.configLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
this.ProfileLabel = new System.Windows.Forms.Label();
@@ -86,7 +88,6 @@ namespace Netch.Forms
this.SettingsButton = new System.Windows.Forms.Button();
this.ProfileGroupBox = new System.Windows.Forms.GroupBox();
this.ProfileTable = new System.Windows.Forms.TableLayoutPanel();
- this.AddTrojanServerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.MenuStrip.SuspendLayout();
this.ConfigurationGroupBox.SuspendLayout();
this.configLayoutPanel.SuspendLayout();
@@ -114,11 +115,12 @@ namespace Netch.Forms
this.OptionsToolStripMenuItem,
this.AboutToolStripButton,
this.VersionLabel,
- this.exitToolStripMenuItem});
+ this.exitToolStripMenuItem,
+ this.RelyToolStripMenuItem});
this.MenuStrip.Location = new System.Drawing.Point(0, 0);
this.MenuStrip.Name = "MenuStrip";
this.MenuStrip.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
- this.MenuStrip.Size = new System.Drawing.Size(629, 26);
+ this.MenuStrip.Size = new System.Drawing.Size(733, 26);
this.MenuStrip.TabIndex = 0;
//
// ServerToolStripMenuItem
@@ -170,6 +172,13 @@ namespace Netch.Forms
this.AddVMessServerToolStripMenuItem.Text = "Add [VMess] Server";
this.AddVMessServerToolStripMenuItem.Click += new System.EventHandler(this.AddVMessServerToolStripMenuItem_Click);
//
+ // AddTrojanServerToolStripMenuItem
+ //
+ this.AddTrojanServerToolStripMenuItem.Name = "AddTrojanServerToolStripMenuItem";
+ this.AddTrojanServerToolStripMenuItem.Size = new System.Drawing.Size(259, 22);
+ this.AddTrojanServerToolStripMenuItem.Text = "Add [Trojan] Server";
+ this.AddTrojanServerToolStripMenuItem.Click += new System.EventHandler(this.AddTrojanServerToolStripMenuItem_Click);
+ //
// ModeToolStripMenuItem
//
this.ModeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -236,49 +245,49 @@ namespace Netch.Forms
// ReloadModesToolStripMenuItem
//
this.ReloadModesToolStripMenuItem.Name = "ReloadModesToolStripMenuItem";
- this.ReloadModesToolStripMenuItem.Size = new System.Drawing.Size(209, 22);
+ this.ReloadModesToolStripMenuItem.Size = new System.Drawing.Size(219, 22);
this.ReloadModesToolStripMenuItem.Text = "Reload Modes";
this.ReloadModesToolStripMenuItem.Click += new System.EventHandler(this.ReloadModesToolStripMenuItem_Click);
//
// RestartServiceToolStripMenuItem
//
this.RestartServiceToolStripMenuItem.Name = "RestartServiceToolStripMenuItem";
- this.RestartServiceToolStripMenuItem.Size = new System.Drawing.Size(209, 22);
+ this.RestartServiceToolStripMenuItem.Size = new System.Drawing.Size(219, 22);
this.RestartServiceToolStripMenuItem.Text = "Restart Service";
this.RestartServiceToolStripMenuItem.Click += new System.EventHandler(this.RestartServiceToolStripMenuItem_Click);
//
// UninstallServiceToolStripMenuItem
//
this.UninstallServiceToolStripMenuItem.Name = "UninstallServiceToolStripMenuItem";
- this.UninstallServiceToolStripMenuItem.Size = new System.Drawing.Size(209, 22);
+ this.UninstallServiceToolStripMenuItem.Size = new System.Drawing.Size(219, 22);
this.UninstallServiceToolStripMenuItem.Text = "Uninstall Service";
this.UninstallServiceToolStripMenuItem.Click += new System.EventHandler(this.UninstallServiceToolStripMenuItem_Click);
//
// CleanDNSCacheToolStripMenuItem
//
this.CleanDNSCacheToolStripMenuItem.Name = "CleanDNSCacheToolStripMenuItem";
- this.CleanDNSCacheToolStripMenuItem.Size = new System.Drawing.Size(209, 22);
+ this.CleanDNSCacheToolStripMenuItem.Size = new System.Drawing.Size(219, 22);
this.CleanDNSCacheToolStripMenuItem.Text = "Clean DNS Cache";
this.CleanDNSCacheToolStripMenuItem.Click += new System.EventHandler(this.CleanDNSCacheToolStripMenuItem_Click);
//
// UpdateACLToolStripMenuItem
//
this.UpdateACLToolStripMenuItem.Name = "UpdateACLToolStripMenuItem";
- this.UpdateACLToolStripMenuItem.Size = new System.Drawing.Size(209, 22);
+ this.UpdateACLToolStripMenuItem.Size = new System.Drawing.Size(219, 22);
this.UpdateACLToolStripMenuItem.Text = "Update ACL";
this.UpdateACLToolStripMenuItem.Click += new System.EventHandler(this.updateACLToolStripMenuItem_Click);
//
// updateACLWithProxyToolStripMenuItem
//
this.updateACLWithProxyToolStripMenuItem.Name = "updateACLWithProxyToolStripMenuItem";
- this.updateACLWithProxyToolStripMenuItem.Size = new System.Drawing.Size(209, 22);
+ this.updateACLWithProxyToolStripMenuItem.Size = new System.Drawing.Size(219, 22);
this.updateACLWithProxyToolStripMenuItem.Text = "Update ACL with proxy";
this.updateACLWithProxyToolStripMenuItem.Click += new System.EventHandler(this.updateACLWithProxyToolStripMenuItem_Click);
//
// reinstallTapDriverToolStripMenuItem
//
this.reinstallTapDriverToolStripMenuItem.Name = "reinstallTapDriverToolStripMenuItem";
- this.reinstallTapDriverToolStripMenuItem.Size = new System.Drawing.Size(209, 22);
+ this.reinstallTapDriverToolStripMenuItem.Size = new System.Drawing.Size(219, 22);
this.reinstallTapDriverToolStripMenuItem.Text = "Reinstall TUN/TAP driver";
this.reinstallTapDriverToolStripMenuItem.Click += new System.EventHandler(this.reinstallTapDriverToolStripMenuItem_Click);
//
@@ -300,8 +309,8 @@ namespace Netch.Forms
this.VersionLabel.IsLink = true;
this.VersionLabel.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline;
this.VersionLabel.Name = "VersionLabel";
- this.VersionLabel.Size = new System.Drawing.Size(32, 19);
- this.VersionLabel.Text = "x.x.x";
+ this.VersionLabel.Size = new System.Drawing.Size(26, 19);
+ this.VersionLabel.Text = "xxx";
this.VersionLabel.Click += new System.EventHandler(this.VersionLabel_Click);
//
// exitToolStripMenuItem
@@ -311,12 +320,21 @@ namespace Netch.Forms
this.exitToolStripMenuItem.Text = "Exit";
this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
//
+ // RelyToolStripMenuItem
+ //
+ this.RelyToolStripMenuItem.BackColor = System.Drawing.SystemColors.Control;
+ this.RelyToolStripMenuItem.ForeColor = System.Drawing.Color.Red;
+ this.RelyToolStripMenuItem.Name = "RelyToolStripMenuItem";
+ this.RelyToolStripMenuItem.Size = new System.Drawing.Size(244, 22);
+ this.RelyToolStripMenuItem.Text = "Unable to start? Click me to download";
+ this.RelyToolStripMenuItem.Click += new System.EventHandler(this.RelyToolStripMenuItem_Click);
+ //
// ConfigurationGroupBox
//
this.ConfigurationGroupBox.Controls.Add(this.configLayoutPanel);
this.ConfigurationGroupBox.Location = new System.Drawing.Point(12, 28);
this.ConfigurationGroupBox.Name = "ConfigurationGroupBox";
- this.ConfigurationGroupBox.Size = new System.Drawing.Size(605, 115);
+ this.ConfigurationGroupBox.Size = new System.Drawing.Size(709, 115);
this.ConfigurationGroupBox.TabIndex = 1;
this.ConfigurationGroupBox.TabStop = false;
this.ConfigurationGroupBox.Text = "Configuration";
@@ -342,7 +360,7 @@ namespace Netch.Forms
this.configLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.configLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.configLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
- this.configLayoutPanel.Size = new System.Drawing.Size(599, 93);
+ this.configLayoutPanel.Size = new System.Drawing.Size(703, 93);
this.configLayoutPanel.TabIndex = 15;
//
// ProfileLabel
@@ -380,7 +398,7 @@ namespace Netch.Forms
this.ProfileNameText.Dock = System.Windows.Forms.DockStyle.Fill;
this.ProfileNameText.Location = new System.Drawing.Point(54, 65);
this.ProfileNameText.Name = "ProfileNameText";
- this.ProfileNameText.Size = new System.Drawing.Size(442, 23);
+ this.ProfileNameText.Size = new System.Drawing.Size(546, 23);
this.ProfileNameText.TabIndex = 11;
//
// ModeComboBox
@@ -392,7 +410,7 @@ namespace Netch.Forms
this.ModeComboBox.IntegralHeight = false;
this.ModeComboBox.Location = new System.Drawing.Point(54, 34);
this.ModeComboBox.Name = "ModeComboBox";
- this.ModeComboBox.Size = new System.Drawing.Size(442, 24);
+ this.ModeComboBox.Size = new System.Drawing.Size(546, 24);
this.ModeComboBox.TabIndex = 2;
this.ModeComboBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ComboBox_DrawItem);
//
@@ -406,7 +424,7 @@ namespace Netch.Forms
this.ServerComboBox.Location = new System.Drawing.Point(54, 3);
this.ServerComboBox.MaxDropDownItems = 16;
this.ServerComboBox.Name = "ServerComboBox";
- this.ServerComboBox.Size = new System.Drawing.Size(442, 24);
+ this.ServerComboBox.Size = new System.Drawing.Size(546, 24);
this.ServerComboBox.TabIndex = 1;
this.ServerComboBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ComboBox_DrawItem);
//
@@ -421,7 +439,7 @@ namespace Netch.Forms
this.tableLayoutPanel2.Controls.Add(this.CopyLinkPictureBox, 3, 0);
this.tableLayoutPanel2.Controls.Add(this.DeletePictureBox, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.SpeedPictureBox, 2, 0);
- this.tableLayoutPanel2.Location = new System.Drawing.Point(502, 3);
+ this.tableLayoutPanel2.Location = new System.Drawing.Point(606, 3);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
@@ -481,7 +499,7 @@ namespace Netch.Forms
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tableLayoutPanel3.Controls.Add(this.EditModePictureBox, 0, 0);
this.tableLayoutPanel3.Controls.Add(this.DeleteModePictureBox, 1, 0);
- this.tableLayoutPanel3.Location = new System.Drawing.Point(502, 34);
+ this.tableLayoutPanel3.Location = new System.Drawing.Point(606, 34);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.RowCount = 1;
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
@@ -523,7 +541,7 @@ namespace Netch.Forms
this.NatTypeStatusLabel});
this.StatusStrip.Location = new System.Drawing.Point(0, 250);
this.StatusStrip.Name = "StatusStrip";
- this.StatusStrip.Size = new System.Drawing.Size(629, 22);
+ this.StatusStrip.Size = new System.Drawing.Size(733, 22);
this.StatusStrip.SizingGrip = false;
this.StatusStrip.TabIndex = 2;
//
@@ -563,7 +581,7 @@ namespace Netch.Forms
// ControlButton
//
this.ControlButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.ControlButton.Location = new System.Drawing.Point(542, 215);
+ this.ControlButton.Location = new System.Drawing.Point(646, 214);
this.ControlButton.Name = "ControlButton";
this.ControlButton.Size = new System.Drawing.Size(75, 27);
this.ControlButton.TabIndex = 3;
@@ -619,7 +637,7 @@ namespace Netch.Forms
this.ProfileGroupBox.Controls.Add(this.ProfileTable);
this.ProfileGroupBox.Location = new System.Drawing.Point(12, 146);
this.ProfileGroupBox.Name = "ProfileGroupBox";
- this.ProfileGroupBox.Size = new System.Drawing.Size(605, 65);
+ this.ProfileGroupBox.Size = new System.Drawing.Size(709, 65);
this.ProfileGroupBox.TabIndex = 13;
this.ProfileGroupBox.TabStop = false;
this.ProfileGroupBox.Text = "Profiles";
@@ -637,21 +655,14 @@ namespace Netch.Forms
this.ProfileTable.RowCount = 1;
this.ProfileTable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.ProfileTable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
- this.ProfileTable.Size = new System.Drawing.Size(599, 43);
+ this.ProfileTable.Size = new System.Drawing.Size(703, 43);
this.ProfileTable.TabIndex = 0;
//
- // AddTrojanServerToolStripMenuItem
- //
- this.AddTrojanServerToolStripMenuItem.Name = "AddTrojanServerToolStripMenuItem";
- this.AddTrojanServerToolStripMenuItem.Size = new System.Drawing.Size(259, 22);
- this.AddTrojanServerToolStripMenuItem.Text = "Add [Trojan] Server";
- this.AddTrojanServerToolStripMenuItem.Click += new System.EventHandler(this.AddTrojanServerToolStripMenuItem_Click);
- //
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
- this.ClientSize = new System.Drawing.Size(629, 272);
+ this.ClientSize = new System.Drawing.Size(733, 272);
this.Controls.Add(this.ProfileGroupBox);
this.Controls.Add(this.SettingsButton);
this.Controls.Add(this.ControlButton);
@@ -748,5 +759,6 @@ namespace Netch.Forms
private System.Windows.Forms.ToolStripMenuItem updateACLWithProxyToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem reinstallTapDriverToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem AddTrojanServerToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem RelyToolStripMenuItem;
}
}
\ No newline at end of file
diff --git a/Netch/Forms/MainForm.cs b/Netch/Forms/MainForm.cs
index 5f381990..e32c4484 100644
--- a/Netch/Forms/MainForm.cs
+++ b/Netch/Forms/MainForm.cs
@@ -260,7 +260,7 @@ namespace Netch.Forms
private void SaveConfigs()
{
Global.Settings.ServerComboBoxSelectedIndex = ServerComboBox.SelectedIndex;
- if (ModeComboBox.Items.Count!=0 && ModeComboBox.SelectedItem != null)
+ if (ModeComboBox.Items.Count != 0 && ModeComboBox.SelectedItem != null)
{
if (ModeComboBox.Tag is object[] list)
@@ -382,6 +382,7 @@ namespace Netch.Forms
StatusLabel.Text = $@"{Utils.i18N.Translate("Status")}{Utils.i18N.Translate(": ")}{Utils.i18N.Translate("Waiting for command")}";
ShowMainFormToolStripButton.Text = Utils.i18N.Translate(ShowMainFormToolStripButton.Text);
ExitToolStripButton.Text = Utils.i18N.Translate(ExitToolStripButton.Text);
+ RelyToolStripMenuItem.Text = Utils.i18N.Translate(RelyToolStripMenuItem.Text);
InitProfile();
@@ -749,7 +750,7 @@ namespace Netch.Forms
private void VersionLabel_Click(object sender, EventArgs e)
{
- Process.Start("https://github.com/NetchX/Netch/releases");
+ Process.Start($"https://github.com/{UpdateChecker.Owner}/{UpdateChecker.Repo}/releases");
}
private void EditPictureBox_Click(object sender, EventArgs e)
@@ -879,8 +880,20 @@ namespace Netch.Forms
if (startResult)
{
- // UsedBandwidthLabel.Visible = UploadSpeedLabel.Visible = DownloadSpeedLabel.Visible = true;
- // MainController.pNFController.OnBandwidthUpdated += OnBandwidthUpdated;
+ Task.Run(() =>
+ {
+ LastUploadBandwidth = 0;
+ //LastDownloadBandwidth = 0;
+ //UploadSpeedLabel.Text = "↑: 0 KB/s";
+ DownloadSpeedLabel.Text = "↑↓: 0 KB/s";
+ UsedBandwidthLabel.Text = $"{Utils.i18N.Translate("Used")}{Utils.i18N.Translate(": ")}0 KB";
+ UsedBandwidthLabel.Visible = UploadSpeedLabel.Visible = DownloadSpeedLabel.Visible = true;
+
+
+ UploadSpeedLabel.Visible = false;
+ Bandwidth.NetTraffic(server, mode, MainController);
+ });
+ //MainController.pNFController.OnBandwidthUpdated += OnBandwidthUpdated;
// 如果勾选启动后最小化
if (Global.Settings.MinimizeWhenStarted)
@@ -1010,12 +1023,12 @@ namespace Netch.Forms
MainController.Stop();
NatTypeStatusLabel.Text = "";
- // LastUploadBandwidth = 0;
- // LastDownloadBandwidth = 0;
- // UploadSpeedLabel.Text = "↑: 0 KB/s";
- // DownloadSpeedLabel.Text = "↓: 0 KB/s";
- // UsedBandwidthLabel.Text = $"{Utils.i18N.Translate("Used")}{Utils.i18N.Translate(": ")}0 KB";
- // UsedBandwidthLabel.Visible = UploadSpeedLabel.Visible = DownloadSpeedLabel.Visible = false;
+ LastUploadBandwidth = 0;
+ LastDownloadBandwidth = 0;
+ UploadSpeedLabel.Text = "↑: 0 KB/s";
+ DownloadSpeedLabel.Text = "↓: 0 KB/s";
+ UsedBandwidthLabel.Text = $"{Utils.i18N.Translate("Used")}{Utils.i18N.Translate(": ")}0 KB";
+ UsedBandwidthLabel.Visible = UploadSpeedLabel.Visible = DownloadSpeedLabel.Visible = false;
ControlButton.Enabled = true;
ProfileGroupBox.Enabled = true;
@@ -1106,16 +1119,42 @@ namespace Netch.Forms
new AboutForm().Show();
Hide();
}
+ public void OnBandwidthUpdated(long download)
+ {
+ try
+ {
+ UsedBandwidthLabel.Text = $"{Utils.i18N.Translate("Used")}{Utils.i18N.Translate(": ")}{Utils.Bandwidth.Compute(download)}";
+ //UploadSpeedLabel.Text = $"↑: {Utils.Bandwidth.Compute(upload - LastUploadBandwidth)}/s";
+ DownloadSpeedLabel.Text = $"↑↓: {Utils.Bandwidth.Compute(download - LastDownloadBandwidth)}/s";
+
+ //LastUploadBandwidth = upload;
+ LastDownloadBandwidth = download;
+ Refresh();
+ }
+ catch (Exception)
+ {
+ }
+ }
public void OnBandwidthUpdated(long upload, long download)
{
- UsedBandwidthLabel.Text = $"{Utils.i18N.Translate("Used")}{Utils.i18N.Translate(": ")}{Utils.Bandwidth.Compute(upload + download)}";
- UploadSpeedLabel.Text = $"↑: {Utils.Bandwidth.Compute(upload - LastUploadBandwidth)}/s";
- DownloadSpeedLabel.Text = $"↓: {Utils.Bandwidth.Compute(download - LastDownloadBandwidth)}/s";
+ try
+ {
+ if (upload < 1 || download < 1)
+ {
+ return;
+ }
+ UsedBandwidthLabel.Text = $"{Utils.i18N.Translate("Used")}{Utils.i18N.Translate(": ")}{Utils.Bandwidth.Compute(upload + download)}";
+ UploadSpeedLabel.Text = $"↑: {Utils.Bandwidth.Compute(upload - LastUploadBandwidth)}/s";
+ DownloadSpeedLabel.Text = $"↓: {Utils.Bandwidth.Compute(download - LastDownloadBandwidth)}/s";
- LastUploadBandwidth = upload;
- LastDownloadBandwidth = download;
- Refresh();
+ LastUploadBandwidth = upload;
+ LastDownloadBandwidth = download;
+ Refresh();
+ }
+ catch (Exception)
+ {
+ }
}
private void ProfileButton_Click(object sender, EventArgs e)
@@ -1372,6 +1411,7 @@ namespace Netch.Forms
NatTypeStatusLabel.Visible = true;
if (!string.IsNullOrWhiteSpace(text))
{
+ text = text.Trim();
NatTypeStatusLabel.Text = "NAT" + Utils.i18N.Translate(": ") + text;
}
else
@@ -1523,5 +1563,10 @@ namespace Netch.Forms
}
});
}
+
+ private void RelyToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Process.Start($"https://mega.nz/file/9OQ1EazJ#0pjJ3xt57AVLr29vYEEv15GSACtXVQOGlEOPpi_2Ico");
+ }
}
}
diff --git a/Netch/Netch.csproj b/Netch/Netch.csproj
index e3a23f97..5689d44c 100644
--- a/Netch/Netch.csproj
+++ b/Netch/Netch.csproj
@@ -51,6 +51,7 @@
+
@@ -97,6 +98,6 @@
-
+
diff --git a/Netch/Resources/zh-CN b/Netch/Resources/zh-CN
index 1b36db31..65f7b687 100644
--- a/Netch/Resources/zh-CN
+++ b/Netch/Resources/zh-CN
@@ -187,6 +187,7 @@
"Show": "显示",
"Exit": "退出",
+ "Unable to start? Click me to download": "无法启动?点我下载依赖",
"Bypass LAN": "[网页代理] 绕过局域网",
"Bypass LAN (Non System Proxy)": "[网页代理] 绕过局域网(不设置系统代理)",
diff --git a/Netch/Utils/Bandwidth.cs b/Netch/Utils/Bandwidth.cs
index ba8c8e6a..7c3f96c0 100644
--- a/Netch/Utils/Bandwidth.cs
+++ b/Netch/Utils/Bandwidth.cs
@@ -1,7 +1,20 @@
-namespace Netch.Utils
+using Microsoft.Diagnostics.Tracing.Parsers;
+using Microsoft.Diagnostics.Tracing.Session;
+using Netch.Controllers;
+using Netch.Forms;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace Netch.Utils
{
public static class Bandwidth
{
+ public static int received = 0;
+
///
/// 计算流量
///
@@ -18,7 +31,105 @@
i++;
} while ((result /= 1024) > 1024);
+ if (result < 0)
+ {
+ result = 0;
+ }
+
return string.Format("{0} {1}", System.Math.Round(result, 2), units[i]);
}
+
+ ///
+ /// 根据程序名统计流量
+ ///
+ ///
+ public static void NetTraffic(Models.Server server, Models.Mode mode, MainController mainController)
+ {
+ var counterLock = new object();
+ //int sent = 0;
+
+ //var processList = Process.GetProcessesByName(ProcessName).Select(p => p.Id).ToHashSet();
+ List processList = new List();
+
+ if (server.Type.Equals("Socks5") && mainController.pHTTPController != null)
+ {
+ processList.Add(mainController.pHTTPController.pPrivoxyController.Instance.Id);
+ }
+ else if (server.Type.Equals("SS") && Global.Settings.BootShadowsocksFromDLL)
+ {
+ processList.Add(Process.GetCurrentProcess().Id);
+ }
+ else if (server.Type.Equals("SS") && mainController.pSSController != null)
+ {
+ processList.Add(mainController.pSSController.Instance.Id);
+ }
+ else if (server.Type.Equals("SSR") && mainController.pSSRController != null)
+ {
+ processList.Add(mainController.pSSRController.Instance.Id);
+ }
+ else if (server.Type.Equals("VMess") && mainController.pVMessController != null)
+ {
+ processList.Add(mainController.pVMessController.Instance.Id);
+ }
+ else if (server.Type.Equals("TR") && mainController.pTrojanController != null)
+ {
+ processList.Add(mainController.pTrojanController.Instance.Id);
+ }
+ else if (mainController.pTUNTAPController != null)
+ {
+ processList.Add(mainController.pTUNTAPController.Instance.Id);
+ }
+ else if (mainController.pNFController != null)
+ {
+ processList.Add(mainController.pNFController.Instance.Id);
+ }
+ Logging.Info("启动流量统计 PID:" + string.Join(",", processList.ToArray()));
+
+ Task.Run(() =>
+ {
+ using (var session = new TraceEventSession("KernelAndClrEventsSession"))
+ {
+ session.EnableKernelProvider(KernelTraceEventParser.Keywords.NetworkTCPIP);
+
+ //这玩意儿上传和下载得到的data是一样的:)
+ //所以暂时没办法区分上传下载流量
+ session.Source.Kernel.TcpIpRecv += data =>
+ {
+ if (processList.Contains(data.ProcessID))
+ {
+ lock (counterLock)
+ received += data.size;
+ //Logging.Info($"TcpIpRecv: {Compute(data.size)}");
+ }
+ };
+ session.Source.Kernel.UdpIpRecv += data =>
+ {
+ if (processList.Contains(data.ProcessID))
+ {
+ lock (counterLock)
+ received += data.size;
+ //Logging.Info($"UdpIpRecv: {Compute(data.size)}");
+ }
+ };
+
+ session.Source.Process();
+ }
+ });
+
+ if ((Convert.ToInt32(MainForm.Instance.LastDownloadBandwidth) - Convert.ToInt32(received)) == 0)
+ {
+ MainForm.Instance.OnBandwidthUpdated(0);
+ received = 0;
+ }
+ while (MainForm.Instance.State != Models.State.Stopped)
+ {
+ Task.Delay(1000).Wait();
+ lock (counterLock)
+ {
+ MainForm.Instance.OnBandwidthUpdated(Convert.ToInt64(received));
+ }
+ }
+
+ }
}
}
diff --git a/Netch/Utils/Configuration.cs b/Netch/Utils/Configuration.cs
index ee9e3378..e471aa2f 100644
--- a/Netch/Utils/Configuration.cs
+++ b/Netch/Utils/Configuration.cs
@@ -26,49 +26,49 @@ namespace Netch.Utils
///
public static void Load()
{
- if (Directory.Exists(DATA_DIR))
+ if (Directory.Exists(DATA_DIR) && File.Exists(SETTINGS_JSON))
{
- if (File.Exists(SETTINGS_JSON))
+ try
{
- try
+ Global.Settings = Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText(SETTINGS_JSON));
+ if (Global.Settings.Server != null && Global.Settings.Server.Count > 0)
{
- Global.Settings = Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText(SETTINGS_JSON));
- if (Global.Settings.Server != null && Global.Settings.Server.Count > 0)
+ // 如果是旧版 Server 类,使用旧版 Server 类进行读取
+ if (Global.Settings.Server[0].Hostname == null)
{
- // 如果是旧版 Server 类,使用旧版 Server 类进行读取
- if (Global.Settings.Server[0].Hostname == null)
+ var LegacySettingConfig = Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText(SETTINGS_JSON));
+ for (var i = 0; i < LegacySettingConfig.Server.Count; i++)
{
- var LegacySettingConfig = Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText(SETTINGS_JSON));
- for (var i = 0; i < LegacySettingConfig.Server.Count; i++)
+ Global.Settings.Server[i].Hostname = LegacySettingConfig.Server[i].Address;
+ if (Global.Settings.Server[i].Type == "Shadowsocks")
{
- Global.Settings.Server[i].Hostname = LegacySettingConfig.Server[i].Address;
- if (Global.Settings.Server[i].Type == "Shadowsocks")
- {
- Global.Settings.Server[i].Type = "SS";
- Global.Settings.Server[i].Plugin = LegacySettingConfig.Server[i].OBFS;
- Global.Settings.Server[i].PluginOption = LegacySettingConfig.Server[i].OBFSParam;
- }
- else if (Global.Settings.Server[i].Type == "ShadowsocksR")
- {
- Global.Settings.Server[i].Type = "SSR";
- }
- else if (Global.Settings.Server[i].Type == "VMess")
- {
- Global.Settings.Server[i].QUICSecure = LegacySettingConfig.Server[i].QUICSecurity;
- }
+ Global.Settings.Server[i].Type = "SS";
+ Global.Settings.Server[i].Plugin = LegacySettingConfig.Server[i].OBFS;
+ Global.Settings.Server[i].PluginOption = LegacySettingConfig.Server[i].OBFSParam;
+ }
+ else if (Global.Settings.Server[i].Type == "ShadowsocksR")
+ {
+ Global.Settings.Server[i].Type = "SSR";
+ }
+ else if (Global.Settings.Server[i].Type == "VMess")
+ {
+ Global.Settings.Server[i].QUICSecure = LegacySettingConfig.Server[i].QUICSecurity;
}
}
}
}
+ }
- catch (Newtonsoft.Json.JsonException)
- {
+ catch (Newtonsoft.Json.JsonException)
+ {
- }
}
}
else
{
+ // 弹出提示
+ MessageBox.Show("如果你是第一次使用本软件\n请务必前往http://netch.org 安装程序所需依赖,\n否则程序将无法正常运行!", i18N.Translate("注意!"), MessageBoxButtons.OK, MessageBoxIcon.Information);
+
// 创建 data 文件夹并保存默认设置
Save();
}
diff --git a/binaries b/binaries
index 385188a7..f93cebfb 160000
--- a/binaries
+++ b/binaries
@@ -1 +1 @@
-Subproject commit 385188a7b6ffa965be2db49fff7ff0b29707791b
+Subproject commit f93cebfb754a5ddaef09582ca8ecccd4a8f2af7e
diff --git a/modes b/modes
index 5ed034a8..f0327e93 160000
--- a/modes
+++ b/modes
@@ -1 +1 @@
-Subproject commit 5ed034a88be50eebeba92abc6e1798d589c93ee0
+Subproject commit f0327e93991856680b4b5f84f02a5401467ceaf5