From 378776ec74c34d0b6709769382b2c64afd0869cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=9B=BD=E4=BC=9F?= <366193849@qq.com> Date: Fri, 19 Nov 2021 17:09:47 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B4=AF=E7=A7=AF=E5=8F=AF=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E7=9A=84IP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FastGithub.DomainResolve/DnsClient.cs | 2 +- FastGithub.DomainResolve/DomainResolver.cs | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/FastGithub.DomainResolve/DnsClient.cs b/FastGithub.DomainResolve/DnsClient.cs index 282e67f..e3e61fa 100644 --- a/FastGithub.DomainResolve/DnsClient.cs +++ b/FastGithub.DomainResolve/DnsClient.cs @@ -36,7 +36,7 @@ namespace FastGithub.DomainResolve private readonly TimeSpan minTimeToLive = TimeSpan.FromSeconds(30d); private readonly TimeSpan maxTimeToLive = TimeSpan.FromMinutes(10d); - private readonly int resolveTimeout = (int)TimeSpan.FromSeconds(2d).TotalMilliseconds; + private readonly int resolveTimeout = (int)TimeSpan.FromSeconds(4d).TotalMilliseconds; private static readonly TimeSpan connectTimeout = TimeSpan.FromSeconds(2d); private record LookupResult(IList Addresses, TimeSpan TimeToLive); diff --git a/FastGithub.DomainResolve/DomainResolver.cs b/FastGithub.DomainResolve/DomainResolver.cs index 20f9836..4a45025 100644 --- a/FastGithub.DomainResolve/DomainResolver.cs +++ b/FastGithub.DomainResolve/DomainResolver.cs @@ -99,7 +99,11 @@ namespace FastGithub.DomainResolve if (keyValue.Value.IsEmpty || keyValue.Value.IsExpired) { var dnsEndPoint = keyValue.Key; - var addresses = new List(); + var addresses = new HashSet(); + foreach (var item in keyValue.Value) + { + addresses.Add(item.Adddress); + } await foreach (var adddress in this.dnsClient.ResolveAsync(dnsEndPoint, fastSort: false, cancellationToken)) { addresses.Add(adddress); @@ -108,14 +112,17 @@ namespace FastGithub.DomainResolve var addressElapseds = IPAddressElapsedCollection.Empty; if (addresses.Count == 1) { - var addressElapsed = new IPAddressElapsed(addresses[0], TimeSpan.Zero); + var addressElapsed = new IPAddressElapsed(addresses.First(), TimeSpan.Zero); addressElapseds = new IPAddressElapsedCollection(addressElapsed); } else if (addresses.Count > 1) { - var tasks = addresses.Select(address => IPAddressElapsed.ParseAsync(address, dnsEndPoint.Port, cancellationToken)); - addressElapseds = new IPAddressElapsedCollection(await Task.WhenAll(tasks)); + var parseTasks = addresses.Select(address => IPAddressElapsed.ParseAsync(address, dnsEndPoint.Port, cancellationToken)); + var parseValues = await Task.WhenAll(parseTasks); + var connectedValues = parseValues.Where(item => item.Elapsed < TimeSpan.MaxValue); + addressElapseds = new IPAddressElapsedCollection(connectedValues); } + this.dnsEndPointAddressElapseds[dnsEndPoint] = addressElapseds; this.logger.LogInformation($"{dnsEndPoint.Host}->{addressElapseds}"); }