查找IP合并到服务

This commit is contained in:
老九 2021-11-20 10:34:20 +08:00
parent 2bc292483b
commit 26868690cb
2 changed files with 22 additions and 12 deletions

View File

@ -103,13 +103,7 @@ namespace FastGithub.DomainResolve
var dnsEndPoint = keyValue.Key;
var oldAddresses = keyValue.Value;
var hashSet = new HashSet<IPAddress>(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;

View File

@ -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;
/// <summary>
/// IP状态服务
/// </summary>
/// <param name="dnsClient"></param>
public IPAddressStatusService(DnsClient dnsClient)
{
this.dnsClient = dnsClient;
}
/// <summary>
/// 并行获取可连接的IP
/// </summary>
/// <param name="addresses"></param>
/// <param name="port"></param>
/// <param name="dnsEndPoint"></param>
/// <param name="cancellationToken"></param>
/// <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>();
}
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)