Skip to content

Commit a2cf95f

Browse files
committed
🐛 NATCheckCommand
1 parent 88ddc7a commit a2cf95f

File tree

2 files changed

+69
-53
lines changed

2 files changed

+69
-53
lines changed

src/BD.WTTS.Client.Plugins.Accelerator/Services.Implementation/NetworkTestService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ private async Task<IPEndPoint> GetServerIPEndPointAsync(string hostNameOrAddress
285285
testServerHostName ??= DEFAULT_TESTSERVER_HOSTNAME;
286286
testServerPort ??= DEFAULT_TESTSTUN5389_PORT;
287287

288-
IStunClient5389 client = await GetStunClient5389Async(protocol, testServerHostName, testServerPort.Value, localIPEndPoint);
288+
using var client = await GetStunClient5389Async(protocol, testServerHostName, testServerPort.Value, localIPEndPoint);
289289

290290
if (client == null)
291291
return null;

src/BD.WTTS.Client.Plugins.Accelerator/UI/ViewModels/NetworkCheckControlViewModel.cs

Lines changed: 68 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -89,28 +89,7 @@ public NetworkCheckControlViewModel()
8989
{
9090
SelectedSTUNAddress = STUNAddress[0];
9191

92-
NATCheckCommand = ReactiveCommand.CreateFromTask(async () =>
93-
{
94-
var natCheckResult = await _networkTestService.TestStunClient3489Async(testServerHostName: SelectedSTUNAddress) ?? new ClassicStunResult { NatType = NatType.Unknown };
95-
var (netSucc, _) = await _networkTestService.TestOpenUrlAsync("https://www.baidu.com");
96-
97-
var publicEndPoint = natCheckResult.PublicEndPoint?.Address.ToString() ?? "Unknown";
98-
var localEndPoint = natCheckResult.LocalEndPoint?.Address.ToString() ?? "Unknown";
99-
100-
var (natLevel, natTypeTip) = natCheckResult.NatType switch
101-
{
102-
// Open
103-
NatType.OpenInternet or NatType.FullCone => ("开放 NAT", "您可与在其网络上具有任意 NAT 类型的用户玩多人游戏和发起多人游戏。"),
104-
// Moderate
105-
NatType.RestrictedCone or NatType.PortRestrictedCone or NatType.SymmetricUdpFirewall => ("中等 NAT", "您可与一些用户玩多人游戏;但是,并且通常你将不会被选为比赛的主持人。"),
106-
// Strict
107-
NatType.Symmetric or NatType.UdpBlocked => ("严格 NAT", "您只能与具有开放 NAT 类型的用户玩多人游戏。您不能被选为比赛的主持人。"),
108-
// Unknown
109-
NatType.Unknown or NatType.UnsupportedServer or _ => ("不可用 NAT", "如果 NAT 不可用,您将无法使用群聊天或连接到某些 Xbox 游戏的多人游戏。"),
110-
};
111-
112-
return new NATFetchResult(publicEndPoint, localEndPoint, natLevel, natTypeTip, netSucc);
113-
});
92+
NATCheckCommand = ReactiveCommand.CreateFromTask(NATCheckAsync);
11493
NATCheckCommand
11594
.IsExecuting
11695
.ToPropertyEx(this, x => x.IsNATChecking);
@@ -144,36 +123,7 @@ public NetworkCheckControlViewModel()
144123

145124
var canDNSCheck = this.WhenAnyValue(x => x.DomainPendingTest)
146125
.Select(domain => domain == string.Empty || DomainRegExp().IsMatch(domain));
147-
DNSCheckCommand = ReactiveCommand.CreateFromTask(async () =>
148-
{
149-
var testDomain = DomainPendingTest == string.Empty ? DefaultTestDomain : DomainPendingTest;
150-
try
151-
{
152-
long delayMs;
153-
IPAddress[] address;
154-
if (ProxySettings.UseDoh)
155-
{
156-
var configDoh = ProxySettings.CustomDohAddres2.Value ?? ProxySettingsWindowViewModel.DohAddress.FirstOrDefault() ?? string.Empty;
157-
(delayMs, address) = await _networkTestService.TestDNSOverHttpsAsync(testDomain, configDoh);
158-
}
159-
else
160-
{
161-
var configDns = ProxySettings.ProxyMasterDns.Value ?? string.Empty;
162-
(delayMs, address) = await _networkTestService.TestDNSAsync(testDomain, configDns, 53);
163-
}
164-
if (address.Length == 0)
165-
throw new Exception("Parsing failed. Return empty ip address.");
166-
167-
DNSTestDelay = delayMs + "ms ";
168-
DNSTestResult = string.Empty + address.FirstOrDefault();
169-
}
170-
catch (Exception ex)
171-
{
172-
Log.Error(nameof(AcceleratorPageViewModel), ex.ToString());
173-
DNSTestDelay = string.Empty;
174-
DNSTestResult = "error";
175-
}
176-
}, canDNSCheck);
126+
DNSCheckCommand = ReactiveCommand.CreateFromTask(DNSCheckAsync, canDNSCheck);
177127
DNSCheckCommand
178128
.IsExecuting
179129
.ToPropertyEx(this, x => x.IsDNSChecking);
@@ -198,4 +148,70 @@ public NetworkCheckControlViewModel()
198148

199149
IPv6CheckCommand.Execute().Subscribe();
200150
}
151+
152+
async Task<NATFetchResult> NATCheckAsync()
153+
{
154+
try
155+
{
156+
return await NATCheckCoreAsync();
157+
}
158+
catch
159+
{
160+
return new("", "", "", "", false);
161+
}
162+
}
163+
164+
async Task<NATFetchResult> NATCheckCoreAsync()
165+
{
166+
var natCheckResult = await _networkTestService.TestStunClient3489Async(testServerHostName: SelectedSTUNAddress) ?? new ClassicStunResult { NatType = NatType.Unknown };
167+
var (netSucc, _) = await _networkTestService.TestOpenUrlAsync("https://www.baidu.com");
168+
169+
var publicEndPoint = natCheckResult.PublicEndPoint?.Address.ToString() ?? "Unknown";
170+
var localEndPoint = natCheckResult.LocalEndPoint?.Address.ToString() ?? "Unknown";
171+
172+
var (natLevel, natTypeTip) = natCheckResult.NatType switch
173+
{
174+
// Open
175+
NatType.OpenInternet or NatType.FullCone => ("开放 NAT", "您可与在其网络上具有任意 NAT 类型的用户玩多人游戏和发起多人游戏。"),
176+
// Moderate
177+
NatType.RestrictedCone or NatType.PortRestrictedCone or NatType.SymmetricUdpFirewall => ("中等 NAT", "您可与一些用户玩多人游戏;但是,并且通常你将不会被选为比赛的主持人。"),
178+
// Strict
179+
NatType.Symmetric or NatType.UdpBlocked => ("严格 NAT", "您只能与具有开放 NAT 类型的用户玩多人游戏。您不能被选为比赛的主持人。"),
180+
// Unknown
181+
NatType.Unknown or NatType.UnsupportedServer or _ => ("不可用 NAT", "如果 NAT 不可用,您将无法使用群聊天或连接到某些 Xbox 游戏的多人游戏。"),
182+
};
183+
184+
return new NATFetchResult(publicEndPoint, localEndPoint, natLevel, natTypeTip, netSucc);
185+
}
186+
187+
async Task DNSCheckAsync()
188+
{
189+
var testDomain = DomainPendingTest == string.Empty ? DefaultTestDomain : DomainPendingTest;
190+
try
191+
{
192+
long delayMs;
193+
IPAddress[] address;
194+
if (ProxySettings.UseDoh)
195+
{
196+
var configDoh = ProxySettings.CustomDohAddres2.Value ?? ProxySettingsWindowViewModel.DohAddress.FirstOrDefault() ?? string.Empty;
197+
(delayMs, address) = await _networkTestService.TestDNSOverHttpsAsync(testDomain, configDoh);
198+
}
199+
else
200+
{
201+
var configDns = ProxySettings.ProxyMasterDns.Value ?? string.Empty;
202+
(delayMs, address) = await _networkTestService.TestDNSAsync(testDomain, configDns, 53);
203+
}
204+
if (address.Length == 0)
205+
throw new Exception("Parsing failed. Return empty ip address.");
206+
207+
DNSTestDelay = delayMs + "ms ";
208+
DNSTestResult = string.Empty + address.FirstOrDefault();
209+
}
210+
catch (Exception ex)
211+
{
212+
Log.Error(nameof(AcceleratorPageViewModel), ex.ToString());
213+
DNSTestDelay = string.Empty;
214+
DNSTestResult = "error";
215+
}
216+
}
201217
}

0 commit comments

Comments
 (0)