diff --git a/FastGithub.DomainResolve/DnsClient.cs b/FastGithub.DomainResolve/DnsClient.cs index 2751488..fb02214 100644 --- a/FastGithub.DomainResolve/DnsClient.cs +++ b/FastGithub.DomainResolve/DnsClient.cs @@ -56,12 +56,22 @@ namespace FastGithub.DomainResolve /// 域名 /// /// - public async IAsyncEnumerable ResolveAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken) + public async IAsyncEnumerable ResolveAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken) { var hashSet = new HashSet(); foreach (var dns in this.GetDnsServers()) { - foreach (var address in await this.LookupAsync(dns, domain, cancellationToken)) + var addresses = await this.LookupAsync(dns, domain, cancellationToken); + var value = Filter(hashSet, addresses).ToArray(); + if (value.Length > 0) + { + yield return value; + } + } + + static IEnumerable Filter(HashSet hashSet, IPAddress[] addresses) + { + foreach (var address in addresses) { if (hashSet.Add(address) == true) { @@ -71,6 +81,7 @@ namespace FastGithub.DomainResolve } } + /// /// 获取dns服务 /// diff --git a/FastGithub.DomainResolve/DomainResolver.cs b/FastGithub.DomainResolve/DomainResolver.cs index c0374af..4d15ea1 100644 --- a/FastGithub.DomainResolve/DomainResolver.cs +++ b/FastGithub.DomainResolve/DomainResolver.cs @@ -12,19 +12,14 @@ namespace FastGithub.DomainResolve /// sealed class DomainResolver : IDomainResolver { - private readonly DnsClient dnsClient; private readonly DomainSpeedTester speedTester; /// /// 域名解析器 - /// - /// + /// /// - public DomainResolver( - DnsClient dnsClient, - DomainSpeedTester speedTester) + public DomainResolver(DomainSpeedTester speedTester) { - this.dnsClient = dnsClient; this.speedTester = speedTester; } @@ -51,8 +46,7 @@ namespace FastGithub.DomainResolve /// public async IAsyncEnumerable ResolveAllAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken) { - var addresses = this.speedTester.GetIPAddresses(domain); - if (addresses.Length > 0) + if (this.speedTester.TryGetOrderAllIPAddresses(domain, out var addresses)) { foreach (var address in addresses) { @@ -62,7 +56,7 @@ namespace FastGithub.DomainResolve else { this.speedTester.Add(domain); - await foreach (var address in this.dnsClient.ResolveAsync(domain, cancellationToken)) + await foreach (var address in this.speedTester.GetOrderAnyIPAddressAsync(domain, cancellationToken)) { yield return address; } diff --git a/FastGithub.DomainResolve/DomainSpeedTester.cs b/FastGithub.DomainResolve/DomainSpeedTester.cs index b832bcd..ddd7682 100644 --- a/FastGithub.DomainResolve/DomainSpeedTester.cs +++ b/FastGithub.DomainResolve/DomainSpeedTester.cs @@ -2,9 +2,11 @@ using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Net; +using System.Runtime.CompilerServices; using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -106,20 +108,42 @@ namespace FastGithub.DomainResolve File.WriteAllBytes(DOMAINS_JSON_FILE, utf8Json); } + /// - /// 获取测试后排序的IP + /// 尝试获取测试后排序的IP地址 /// /// + /// /// - public IPAddress[] GetIPAddresses(string domain) + public bool TryGetOrderAllIPAddresses(string domain, [MaybeNullWhen(false)] out IPAddress[] addresses) { lock (this.syncRoot) { if (this.domainIPAddressHashSet.TryGetValue(domain, out var hashSet) && hashSet.Count > 0) { - return hashSet.ToArray().OrderBy(item => item.PingElapsed).Select(item => item.Address).ToArray(); + addresses = hashSet.ToArray().OrderBy(item => item.PingElapsed).Select(item => item.Address).ToArray(); + return true; + } + } + + addresses = default; + return false; + } + + /// + /// 获取只排序头个元素的IP地址 + /// + /// 域名 + /// + /// + public async IAsyncEnumerable GetOrderAnyIPAddressAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken) + { + await foreach (var addresses in this.dnsClient.ResolveAsync(domain, cancellationToken)) + { + foreach (var address in addresses) + { + yield return address; } - return Array.Empty(); } } @@ -140,9 +164,12 @@ namespace FastGithub.DomainResolve { var domain = keyValue.Key; var hashSet = keyValue.Value; - await foreach (var address in this.dnsClient.ResolveAsync(domain, cancellationToken)) + await foreach (var addresses in this.dnsClient.ResolveAsync(domain, cancellationToken)) { - hashSet.Add(new IPAddressItem(address)); + foreach (var address in addresses) + { + hashSet.Add(new IPAddressItem(address)); + } } await hashSet.PingAllAsync(); }