From 26868690cb7bc07d211437b526c1bfd1e94968ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=81=E4=B9=9D?= <366193849@qq.com> Date: Sat, 20 Nov 2021 10:34:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E6=89=BEIP=E5=90=88=E5=B9=B6=E5=88=B0?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FastGithub.DomainResolve/DomainResolver.cs | 8 +----- .../IPAddressStatusService.cs | 26 +++++++++++++++---- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/FastGithub.DomainResolve/DomainResolver.cs b/FastGithub.DomainResolve/DomainResolver.cs index 816d0b1..5081d5b 100644 --- a/FastGithub.DomainResolve/DomainResolver.cs +++ b/FastGithub.DomainResolve/DomainResolver.cs @@ -103,13 +103,7 @@ namespace FastGithub.DomainResolve var dnsEndPoint = keyValue.Key; var oldAddresses = keyValue.Value; - var hashSet = new HashSet(oldAddresses); - await foreach (var address in this.dnsClient.ResolveAsync(dnsEndPoint, fastSort: false, cancellationToken)) - { - hashSet.Add(address); - } - - var newAddresses = await this.statusService.GetAvailableAddressesAsync(hashSet, dnsEndPoint.Port, cancellationToken); + var newAddresses = await this.statusService.GetAvailableAddressesAsync(dnsEndPoint, cancellationToken); if (oldAddresses.SequenceEqual(newAddresses) == false) { this.dnsEndPointAddress[dnsEndPoint] = newAddresses; diff --git a/FastGithub.DomainResolve/IPAddressStatusService.cs b/FastGithub.DomainResolve/IPAddressStatusService.cs index 0ebb56f..9df0037 100644 --- a/FastGithub.DomainResolve/IPAddressStatusService.cs +++ b/FastGithub.DomainResolve/IPAddressStatusService.cs @@ -24,21 +24,37 @@ namespace FastGithub.DomainResolve private readonly TimeSpan connectTimeout = TimeSpan.FromSeconds(5d); private readonly IMemoryCache statusCache = new MemoryCache(Options.Create(new MemoryCacheOptions())); + private readonly DnsClient dnsClient; + + /// + /// IP状态服务 + /// + /// + public IPAddressStatusService(DnsClient dnsClient) + { + this.dnsClient = dnsClient; + } + /// /// 并行获取可连接的IP /// - /// - /// + /// /// /// - public async Task GetAvailableAddressesAsync(IEnumerable addresses, int port, CancellationToken cancellationToken) + public async Task GetAvailableAddressesAsync(DnsEndPoint dnsEndPoint, CancellationToken cancellationToken) { - if (addresses.Any() == false) + var addresses = new List(); + await foreach (var address in this.dnsClient.ResolveAsync(dnsEndPoint, fastSort: false, cancellationToken)) + { + addresses.Add(address); + } + + if (addresses.Count == 0) { return Array.Empty(); } - var statusTasks = addresses.Select(item => this.GetStatusAsync(item, port, cancellationToken)); + var statusTasks = addresses.Select(address => this.GetStatusAsync(address, dnsEndPoint.Port, cancellationToken)); var statusArray = await Task.WhenAll(statusTasks); return statusArray .Where(item => item.Elapsed < TimeSpan.MaxValue)