|
@@ -24,21 +24,37 @@ namespace FastGithub.DomainResolve
|
|
private readonly TimeSpan connectTimeout = TimeSpan.FromSeconds(5d);
|
|
private readonly TimeSpan connectTimeout = TimeSpan.FromSeconds(5d);
|
|
private readonly IMemoryCache statusCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
|
|
private readonly IMemoryCache statusCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
|
|
|
|
|
|
|
|
+ private readonly DnsClient dnsClient;
|
|
|
|
+
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// IP状态服务
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="dnsClient"></param>
|
|
|
|
+ public IPAddressStatusService(DnsClient dnsClient)
|
|
|
|
+ {
|
|
|
|
+ this.dnsClient = dnsClient;
|
|
|
|
+ }
|
|
|
|
+
|
|
/// <summary>
|
|
/// <summary>
|
|
/// 并行获取可连接的IP
|
|
/// 并行获取可连接的IP
|
|
/// </summary>
|
|
/// </summary>
|
|
- /// <param name="addresses"></param>
|
|
|
|
- /// <param name="port"></param>
|
|
|
|
|
|
+ /// <param name="dnsEndPoint"></param>
|
|
/// <param name="cancellationToken"></param>
|
|
/// <param name="cancellationToken"></param>
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
- public async Task<IPAddress[]> GetAvailableAddressesAsync(IEnumerable<IPAddress> addresses, int port, CancellationToken cancellationToken)
|
|
|
|
|
|
+ public async Task<IPAddress[]> GetAvailableAddressesAsync(DnsEndPoint dnsEndPoint, CancellationToken cancellationToken)
|
|
{
|
|
{
|
|
- if (addresses.Any() == false)
|
|
|
|
|
|
+ var addresses = new List<IPAddress>();
|
|
|
|
+ await foreach (var address in this.dnsClient.ResolveAsync(dnsEndPoint, fastSort: false, cancellationToken))
|
|
|
|
+ {
|
|
|
|
+ addresses.Add(address);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (addresses.Count == 0)
|
|
{
|
|
{
|
|
return Array.Empty<IPAddress>();
|
|
return Array.Empty<IPAddress>();
|
|
}
|
|
}
|
|
|
|
|
|
- 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);
|
|
var statusArray = await Task.WhenAll(statusTasks);
|
|
return statusArray
|
|
return statusArray
|
|
.Where(item => item.Elapsed < TimeSpan.MaxValue)
|
|
.Where(item => item.Elapsed < TimeSpan.MaxValue)
|