diff --git a/Netch/Controllers/NTTController.cs b/Netch/Controllers/NTTController.cs index 12e2485b..33ead8a7 100644 --- a/Netch/Controllers/NTTController.cs +++ b/Netch/Controllers/NTTController.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using System.IO; using System.Linq; using Netch.Utils; @@ -7,10 +8,6 @@ namespace Netch.Controllers { public class NTTController : Guard, IController { - private string _localEnd; - private string _publicEnd; - private string _result; - private string _bindingTest; public override string Name { get; protected set; } = "NTT"; public override string MainFile { get; protected set; } = "NTT.exe"; @@ -20,7 +17,10 @@ namespace Netch.Controllers /// public (string, string, string) Start() { - _result = _localEnd = _publicEnd = null; + string localEnd=null; + string publicEnd=null; + string result =null; + string bindingTest=null; try { @@ -28,12 +28,50 @@ namespace Netch.Controllers Instance.OutputDataReceived += OnOutputDataReceived; Instance.ErrorDataReceived += OnOutputDataReceived; Instance.Start(); - Instance.BeginOutputReadLine(); - Instance.BeginErrorReadLine(); - Instance.WaitForExit(); - if (_bindingTest == "Fail") - _result = "UdpBlocked"; - return (_result, _localEnd, _publicEnd); + var output = Instance.StandardOutput.ReadToEnd(); + try + { + File.WriteAllText(Path.Combine(Global.NetchDir, $"logging\\{Name}.log"), output); + } + catch (Exception e) + { + Logging.Warning($"写入 {Name} 日志错误:\n" + e.Message); + } + + foreach (var line in output.Split('\n')) + { + var str = line.Split(':').Select(s => s.Trim()).ToArray(); + if (str.Length < 2) + continue; + var key = str[0]; + var value = str[1]; + switch (key) + { + case "Other address is": + case "Nat mapping behavior": + case "Nat filtering behavior": + break; + case "Binding test": + bindingTest = value; + break; + case "Local address": + localEnd = value; + break; + case "Mapped address": + publicEnd = value; + break; + case "result": + result = value; + break; + default: + result = str.Last(); + break; + } + } + + if (bindingTest == "Fail") + result = "UdpBlocked"; + return (result, localEnd, publicEnd); } catch (Exception e) { @@ -51,41 +89,6 @@ namespace Netch.Controllers } } - - private new void OnOutputDataReceived(object sender, DataReceivedEventArgs e) - { - if (string.IsNullOrEmpty(e.Data)) return; - Logging.Info($"[NTT] {e.Data}"); - - var str = e.Data.Split(':').Select(s => s.Trim()).ToArray(); - if (str.Length < 2) - return; - var key = str[0]; - var value = str[1]; - switch (key) - { - case "Other address is": - case "Nat mapping behavior": - case "Nat filtering behavior": - break; - case "Binding test": - _bindingTest = value; - break; - case "Local address": - _localEnd = value; - break; - case "Mapped address": - _publicEnd = value; - break; - case "result": - _result = value; - break; - default: - _result = str.Last(); - break; - } - } - public override void Stop() { StopInstance();