using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Net.Sockets; namespace LanDiscovery.Services { public class NetworkInterfaceInfo { public string? Id { get; set; } // GUID public string? Name { get; set; } // Friendly Name public string? Description { get; set; } public string? IpAddress { get; set; } public string? SubnetMask { get; set; } public string? Gateway { get; set; } public NetworkInterface? NativeInterface { get; set; } public override string ToString() { return $"{Name} ({IpAddress})"; } } public class NetworkInterfaceService { public List GetAllIpv4Interfaces() { var results = new List(); foreach (var nic in NetworkInterface.GetAllNetworkInterfaces()) { // Filter out non-ethernet/wifi/loopback to reduce noise, unless necessary. // For now, accept generic types but ensure they are Up and not Loopback if (nic.NetworkInterfaceType == NetworkInterfaceType.Loopback || nic.OperationalStatus != OperationalStatus.Up) { continue; } var ipProps = nic.GetIPProperties(); var ipv4 = ipProps.UnicastAddresses .FirstOrDefault(addr => addr.Address.AddressFamily == AddressFamily.InterNetwork); if (ipv4 != null) { var gateway = ipProps.GatewayAddresses .FirstOrDefault(g => g.Address.AddressFamily == AddressFamily.InterNetwork)?.Address.ToString() ?? ""; results.Add(new NetworkInterfaceInfo { Id = nic.Id, Name = nic.Name, Description = nic.Description, IpAddress = ipv4.Address.ToString(), SubnetMask = ipv4.IPv4Mask.ToString(), Gateway = gateway, NativeInterface = nic }); } } // Sort: Interfaces with Gateway first // Then Ethernet, Then Wifi return results.OrderByDescending(r => !string.IsNullOrEmpty(r.Gateway)) .ThenBy(r => r.NativeInterface?.NetworkInterfaceType == NetworkInterfaceType.Ethernet ? 0 : 1) .ThenBy(r => r.NativeInterface?.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 ? 0 : 1) .ToList(); } } }