Exemplo n.º 1
0
        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)");
        }
Exemplo n.º 2
0
        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);
        }