查找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 dnsEndPoint = keyValue.Key;
var oldAddresses = keyValue.Value; var oldAddresses = keyValue.Value;
var hashSet = new HashSet<IPAddress>(oldAddresses); var newAddresses = await this.statusService.GetAvailableAddressesAsync(dnsEndPoint, cancellationToken);
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);
if (oldAddresses.SequenceEqual(newAddresses) == false) if (oldAddresses.SequenceEqual(newAddresses) == false)
{ {
this.dnsEndPointAddress[dnsEndPoint] = newAddresses; this.dnsEndPointAddress[dnsEndPoint] = newAddresses;

View File

@ -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="dnsEndPoint"></param>
/// <param name="port"></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)