调整接口

This commit is contained in:
老九 2021-09-28 21:27:20 +08:00
parent e8c5fd5216
commit e88312d177
3 changed files with 50 additions and 18 deletions

View File

@ -56,12 +56,22 @@ namespace FastGithub.DomainResolve
/// <param name="domain">域名</param> /// <param name="domain">域名</param>
/// <param name="cancellationToken"></param> /// <param name="cancellationToken"></param>
/// <returns></returns> /// <returns></returns>
public async IAsyncEnumerable<IPAddress> ResolveAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken) public async IAsyncEnumerable<IPAddress[]> ResolveAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken)
{ {
var hashSet = new HashSet<IPAddress>(); var hashSet = new HashSet<IPAddress>();
foreach (var dns in this.GetDnsServers()) 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<IPAddress> Filter(HashSet<IPAddress> hashSet, IPAddress[] addresses)
{
foreach (var address in addresses)
{ {
if (hashSet.Add(address) == true) if (hashSet.Add(address) == true)
{ {
@ -71,6 +81,7 @@ namespace FastGithub.DomainResolve
} }
} }
/// <summary> /// <summary>
/// 获取dns服务 /// 获取dns服务
/// </summary> /// </summary>

View File

@ -12,19 +12,14 @@ namespace FastGithub.DomainResolve
/// </summary> /// </summary>
sealed class DomainResolver : IDomainResolver sealed class DomainResolver : IDomainResolver
{ {
private readonly DnsClient dnsClient;
private readonly DomainSpeedTester speedTester; private readonly DomainSpeedTester speedTester;
/// <summary> /// <summary>
/// 域名解析器 /// 域名解析器
/// </summary> /// </summary>
/// <param name="dnsClient"></param>
/// <param name="speedTester"></param> /// <param name="speedTester"></param>
public DomainResolver( public DomainResolver(DomainSpeedTester speedTester)
DnsClient dnsClient,
DomainSpeedTester speedTester)
{ {
this.dnsClient = dnsClient;
this.speedTester = speedTester; this.speedTester = speedTester;
} }
@ -51,8 +46,7 @@ namespace FastGithub.DomainResolve
/// <returns></returns> /// <returns></returns>
public async IAsyncEnumerable<IPAddress> ResolveAllAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken) public async IAsyncEnumerable<IPAddress> ResolveAllAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken)
{ {
var addresses = this.speedTester.GetIPAddresses(domain); if (this.speedTester.TryGetOrderAllIPAddresses(domain, out var addresses))
if (addresses.Length > 0)
{ {
foreach (var address in addresses) foreach (var address in addresses)
{ {
@ -62,7 +56,7 @@ namespace FastGithub.DomainResolve
else else
{ {
this.speedTester.Add(domain); 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; yield return address;
} }

View File

@ -2,9 +2,11 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Runtime.CompilerServices;
using System.Text.Json; using System.Text.Json;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -106,20 +108,42 @@ namespace FastGithub.DomainResolve
File.WriteAllBytes(DOMAINS_JSON_FILE, utf8Json); File.WriteAllBytes(DOMAINS_JSON_FILE, utf8Json);
} }
/// <summary> /// <summary>
/// 获取测试后排序的IP /// 尝试获取测试后排序的IP地址
/// </summary> /// </summary>
/// <param name="domain"></param> /// <param name="domain"></param>
/// <param name="addresses"></param>
/// <returns></returns> /// <returns></returns>
public IPAddress[] GetIPAddresses(string domain) public bool TryGetOrderAllIPAddresses(string domain, [MaybeNullWhen(false)] out IPAddress[] addresses)
{ {
lock (this.syncRoot) lock (this.syncRoot)
{ {
if (this.domainIPAddressHashSet.TryGetValue(domain, out var hashSet) && hashSet.Count > 0) 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;
}
/// <summary>
/// 获取只排序头个元素的IP地址
/// </summary>
/// <param name="domain">域名</param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async IAsyncEnumerable<IPAddress> 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<IPAddress>();
} }
} }
@ -140,9 +164,12 @@ namespace FastGithub.DomainResolve
{ {
var domain = keyValue.Key; var domain = keyValue.Key;
var hashSet = keyValue.Value; 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(); await hashSet.PingAllAsync();
} }