using System.Net; namespace Agent.Windows.Network; public sealed record NetworkEndpoint(IPAddress Address, ushort Port); public static class NetworkAllowanceSnapshot { public static async Task> ResolveAsync(IEnumerable<(string Host, IReadOnlyList Ports)> allowances, CancellationToken cancellationToken) { var endpoints = new HashSet(); foreach ((string host, IReadOnlyList ports) in allowances) { IPAddress[] addresses = await Dns.GetHostAddressesAsync(host, cancellationToken).ConfigureAwait(false); foreach (int port in ports) { if (port is < 1 or > 65535) throw new ArgumentOutOfRangeException(nameof(allowances), $"Invalid network port {port}."); foreach (IPAddress address in addresses.Where(static item => item.AddressFamily is System.Net.Sockets.AddressFamily.InterNetwork or System.Net.Sockets.AddressFamily.InterNetworkV6)) endpoints.Add(new(address, (ushort)port)); } } return endpoints.OrderBy(static item => item.Address.ToString(), StringComparer.Ordinal) .ThenBy(static item => item.Port).ToArray(); } }