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();
}