public void SearchIPv4PrefixMap(IPv4PrefixMap map) { int threadCount = Math.Max(Environment.ProcessorCount - 1, 2); int searchesPerThread = settings.Value.SearchCount / threadCount; //TODO: Convert to PLINQ expression? var sw = Stopwatch.StartNew(); var batches = Enumerable.Range(1, threadCount) .Select(id => Task.Run(() => map.FindNetworks(id, GenerateRandomIPAddresses(searchesPerThread)).ToList())) .ToArray(); Task.WaitAll(batches); sw.Stop(); long searchTime = sw.ElapsedMilliseconds; var totalResultCount = batches.Select(x => x.Result.Count).Sum(); var results = batches.SelectMany(x => x.Result.Take(5)); Console.WriteLine("Sample Search Results"); foreach (var x in results) { string block = $"{x.Prefix} ({(x.Prefix.HasFlag ? "Azure" : "Amazon")})"; string message = $" * [{x.Thread}] ip: {IPv4.ConvertToString(x.Address),-17} net: {block,-27} miss: {x.Counter,-5}"; Console.WriteLine(message); } Console.WriteLine(); Console.WriteLine($"Found {totalResultCount} matching addresses in {map.Count} distinct prefixes ({searchTime} ms)"); }
public async Task <IPv4PrefixMap> RetrieveIPv4PrefixMap() { IPv4PrefixMap value; var networkMapPath = settings.Value.NetworkMapPath; var sw = Stopwatch.StartNew(); if (File.Exists(networkMapPath) && (DateTime.Now - File.GetLastWriteTime(networkMapPath)).TotalDays < 7) { value = await IPv4PrefixMap.ReadFile(networkMapPath); Console.WriteLine($" - Prefix map deserialization completed ({sw.ElapsedMilliseconds} ms)"); } else { //TODO: Convert to PLINQ expression? var awsRangeTask = Task.Run(() => services.GetRequiredService <IAwsRangeClient>().GetAwsIPRange()); var azureRangeTask = Task.Run(() => services.GetRequiredService <IAzureRangeClient>().GetAzureIPRange()); Task.WaitAll(new Task[] { awsRangeTask, azureRangeTask }); Console.WriteLine($" - Downloading IP Ranges completed ({sw.ElapsedMilliseconds} ms)"); sw.Restart(); var awsPrefixes = awsRangeTask.Result.IPv4Prefixes.Select(x => x.Prefix); var azurePrefixes = azureRangeTask.Result.Services.SelectMany(x => x.Value.AddressPrefixes.Select(IPv4Prefix.SetMaskFlag)); var prefixes = IPv4Prefix.Consolidate(awsPrefixes.Union(azurePrefixes)).ToList(); value = new IPv4PrefixMap(prefixes); Console.WriteLine($" - Constructing prefix map completed ({sw.ElapsedMilliseconds} ms)"); sw.Restart(); await value.WriteFile(networkMapPath); Console.WriteLine($" - Prefix map serialization completed ({sw.ElapsedMilliseconds} ms)"); } return(value); }