Przeglądaj źródła

Fix local endpoint in UI

Bruce Wayne 4 lat temu
rodzic
commit
b3728f7f38

+ 7 - 0
NatTypeTester.ViewModels/MainWindowViewModel.cs

@@ -140,6 +140,8 @@ namespace NatTypeTester.ViewModels
 
 					Result3489 = client.Status;
 					await client.Query3489Async();
+
+					Result3489.LocalEndPoint = client.LocalEndPoint;
 				}
 				else
 				{
@@ -170,6 +172,11 @@ namespace NatTypeTester.ViewModels
 
 					Result5389 = client.Status;
 					await client.QueryAsync();
+
+					var cache = new StunResult5389();
+					cache.Clone(client.Status);
+					cache.LocalEndPoint = client.LocalEndPoint;
+					Result5389 = cache;
 				}
 				else
 				{

+ 1 - 4
STUN/Client/StunClient3489.cs

@@ -87,10 +87,7 @@ namespace STUN.Client
 					return;
 				}
 
-				if (local1 is not null)
-				{
-					Status.LocalEndPoint = LocalEndPoint;
-				}
+				Status.LocalEndPoint = local1 is null ? null : new IPEndPoint(local1, LocalEndPoint.Port);
 
 				var mappedAddress1 = response1.GetMappedAddressAttribute();
 				var changedAddress1 = response1.GetChangedAddressAttribute();

+ 18 - 26
STUN/Client/StunClient5389UDP.cs

@@ -28,24 +28,12 @@ namespace STUN.Client
 			Status.LocalEndPoint = local;
 		}
 
-		private void Init()
-		{
-			Status.PublicEndPoint = default;
-			Status.LocalEndPoint = default;
-			Status.OtherEndPoint = default;
-			Status.BindingTestResult = BindingTestResult.Unknown;
-			Status.MappingBehavior = MappingBehavior.Unknown;
-			Status.FilteringBehavior = FilteringBehavior.Unknown;
-		}
-
 		public async Task QueryAsync()
 		{
 			try
 			{
-				Init();
-
+				Status.Reset();
 				using var cts = new CancellationTokenSource(Timeout);
-
 				await Proxy.ConnectAsync(cts.Token);
 
 				await FilteringBehaviorTestBaseAsync(cts.Token);
@@ -82,10 +70,10 @@ namespace STUN.Client
 		{
 			try
 			{
-				Init();
+				Status.Reset();
 				using var cts = new CancellationTokenSource(Timeout);
 				await Proxy.ConnectAsync(cts.Token);
-				await BindingTestBaseAsync(RemoteEndPoint, Status, cts.Token);
+				await BindingTestInternalAsync(cts.Token);
 			}
 			finally
 			{
@@ -93,8 +81,14 @@ namespace STUN.Client
 			}
 		}
 
-		private async Task BindingTestBaseAsync(IPEndPoint remote, StunResult5389 result, CancellationToken token)
+		private async Task BindingTestInternalAsync(CancellationToken token)
 		{
+			Status.Clone(await BindingTestBaseAsync(RemoteEndPoint, token));
+		}
+
+		private async Task<StunResult5389> BindingTestBaseAsync(IPEndPoint remote, CancellationToken token)
+		{
+			var result = new StunResult5389();
 			var test = new StunMessage5389 { StunMessageType = StunMessageType.BindingRequest };
 			var (response1, _, local1) = await TestAsync(test, remote, remote, token);
 			var mappedAddress1 = response1.GetXorMappedAddressAttribute();
@@ -117,18 +111,20 @@ namespace STUN.Client
 			result.LocalEndPoint = local;
 			result.PublicEndPoint = mappedAddress1;
 			result.OtherEndPoint = otherAddress;
+
+			return result;
 		}
 
 		public async Task MappingBehaviorTestAsync()
 		{
 			try
 			{
-				Init();
+				Status.Reset();
 				using var cts = new CancellationTokenSource(Timeout);
 				await Proxy.ConnectAsync(cts.Token);
 
 				// test I
-				await BindingTestBaseAsync(RemoteEndPoint, Status, cts.Token);
+				await BindingTestInternalAsync(cts.Token);
 				if (Status.BindingTestResult != BindingTestResult.Success)
 				{
 					return;
@@ -166,9 +162,7 @@ namespace STUN.Client
 
 		private async Task<(bool, StunResult5389)> MappingBehaviorTestBase2Async(CancellationToken token)
 		{
-			var result2 = new StunResult5389();
-			await BindingTestBaseAsync(new IPEndPoint(Status.OtherEndPoint!.Address, RemoteEndPoint.Port), result2, token);
-			Status.LocalEndPoint = result2.LocalEndPoint;
+			var result2 = await BindingTestBaseAsync(new IPEndPoint(Status.OtherEndPoint!.Address, RemoteEndPoint.Port), token);
 			if (result2.BindingTestResult != BindingTestResult.Success)
 			{
 				Status.MappingBehavior = MappingBehavior.Fail;
@@ -186,9 +180,7 @@ namespace STUN.Client
 
 		private async Task MappingBehaviorTestBase3Async(StunResult5389 result2, CancellationToken token)
 		{
-			var result3 = new StunResult5389();
-			await BindingTestBaseAsync(Status.OtherEndPoint!, result3, token);
-			Status.LocalEndPoint = result3.LocalEndPoint;
+			var result3 = await BindingTestBaseAsync(Status.OtherEndPoint!, token);
 			if (result3.BindingTestResult != BindingTestResult.Success)
 			{
 				Status.MappingBehavior = MappingBehavior.Fail;
@@ -201,7 +193,7 @@ namespace STUN.Client
 		private async Task FilteringBehaviorTestBaseAsync(CancellationToken token)
 		{
 			// test I
-			await BindingTestBaseAsync(RemoteEndPoint, Status, token);
+			await BindingTestInternalAsync(token);
 			if (Status.BindingTestResult != BindingTestResult.Success)
 			{
 				return;
@@ -257,7 +249,7 @@ namespace STUN.Client
 		{
 			try
 			{
-				Init();
+				Status.Reset();
 				using var cts = new CancellationTokenSource(Timeout);
 				await Proxy.ConnectAsync(cts.Token);
 				await FilteringBehaviorTestBaseAsync(cts.Token);

+ 0 - 1
STUN/Proxy/NoneUdpProxy.cs

@@ -33,7 +33,6 @@ namespace STUN.Proxy
 
 		public Task DisconnectAsync()
 		{
-			_udpClient.Close();
 			return Task.CompletedTask;
 		}
 

+ 20 - 0
STUN/StunResult/StunResult5389.cs

@@ -17,5 +17,25 @@ namespace STUN.StunResult
 
 		[Reactive]
 		public FilteringBehavior FilteringBehavior { get; set; } = FilteringBehavior.Unknown;
+
+		public void Clone(StunResult5389 result)
+		{
+			PublicEndPoint = result.PublicEndPoint;
+			LocalEndPoint = result.LocalEndPoint;
+			OtherEndPoint = result.OtherEndPoint;
+			BindingTestResult = result.BindingTestResult;
+			MappingBehavior = result.MappingBehavior;
+			FilteringBehavior = result.FilteringBehavior;
+		}
+
+		public void Reset()
+		{
+			PublicEndPoint = default;
+			LocalEndPoint = default;
+			OtherEndPoint = default;
+			BindingTestResult = BindingTestResult.Unknown;
+			MappingBehavior = MappingBehavior.Unknown;
+			FilteringBehavior = FilteringBehavior.Unknown;
+		}
 	}
 }