查找IP合并到服务
This commit is contained in:
parent
2bc292483b
commit
26868690cb
@ -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;
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user