累积可连接的IP

This commit is contained in:
陈国伟 2021-11-19 17:09:47 +08:00
parent 10f5f0b44d
commit 378776ec74
2 changed files with 12 additions and 5 deletions

View File

@ -36,7 +36,7 @@ namespace FastGithub.DomainResolve
private readonly TimeSpan minTimeToLive = TimeSpan.FromSeconds(30d); private readonly TimeSpan minTimeToLive = TimeSpan.FromSeconds(30d);
private readonly TimeSpan maxTimeToLive = TimeSpan.FromMinutes(10d); private readonly TimeSpan maxTimeToLive = TimeSpan.FromMinutes(10d);
private readonly int resolveTimeout = (int)TimeSpan.FromSeconds(2d).TotalMilliseconds; private readonly int resolveTimeout = (int)TimeSpan.FromSeconds(4d).TotalMilliseconds;
private static readonly TimeSpan connectTimeout = TimeSpan.FromSeconds(2d); private static readonly TimeSpan connectTimeout = TimeSpan.FromSeconds(2d);
private record LookupResult(IList<IPAddress> Addresses, TimeSpan TimeToLive); private record LookupResult(IList<IPAddress> Addresses, TimeSpan TimeToLive);

View File

@ -99,7 +99,11 @@ namespace FastGithub.DomainResolve
if (keyValue.Value.IsEmpty || keyValue.Value.IsExpired) if (keyValue.Value.IsEmpty || keyValue.Value.IsExpired)
{ {
var dnsEndPoint = keyValue.Key; var dnsEndPoint = keyValue.Key;
var addresses = new List<IPAddress>(); var addresses = new HashSet<IPAddress>();
foreach (var item in keyValue.Value)
{
addresses.Add(item.Adddress);
}
await foreach (var adddress in this.dnsClient.ResolveAsync(dnsEndPoint, fastSort: false, cancellationToken)) await foreach (var adddress in this.dnsClient.ResolveAsync(dnsEndPoint, fastSort: false, cancellationToken))
{ {
addresses.Add(adddress); addresses.Add(adddress);
@ -108,14 +112,17 @@ namespace FastGithub.DomainResolve
var addressElapseds = IPAddressElapsedCollection.Empty; var addressElapseds = IPAddressElapsedCollection.Empty;
if (addresses.Count == 1) if (addresses.Count == 1)
{ {
var addressElapsed = new IPAddressElapsed(addresses[0], TimeSpan.Zero); var addressElapsed = new IPAddressElapsed(addresses.First(), TimeSpan.Zero);
addressElapseds = new IPAddressElapsedCollection(addressElapsed); addressElapseds = new IPAddressElapsedCollection(addressElapsed);
} }
else if (addresses.Count > 1) else if (addresses.Count > 1)
{ {
var tasks = addresses.Select(address => IPAddressElapsed.ParseAsync(address, dnsEndPoint.Port, cancellationToken)); var parseTasks = addresses.Select(address => IPAddressElapsed.ParseAsync(address, dnsEndPoint.Port, cancellationToken));
addressElapseds = new IPAddressElapsedCollection(await Task.WhenAll(tasks)); var parseValues = await Task.WhenAll(parseTasks);
var connectedValues = parseValues.Where(item => item.Elapsed < TimeSpan.MaxValue);
addressElapseds = new IPAddressElapsedCollection(connectedValues);
} }
this.dnsEndPointAddressElapseds[dnsEndPoint] = addressElapseds; this.dnsEndPointAddressElapseds[dnsEndPoint] = addressElapseds;
this.logger.LogInformation($"{dnsEndPoint.Host}->{addressElapseds}"); this.logger.LogInformation($"{dnsEndPoint.Host}->{addressElapseds}");
} }