// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 // // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 // // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! using System.Net.NetworkInformation; using System.Net.Sockets; namespace Admin.NET.Core; /// /// 网卡信息帮助类 /// public static class NetworkHelper { /// /// 网卡信息 /// /// /// 推荐使用,默认有缓存 /// public static List NetworkInfos => Cache.Default.GetOrAdd("NetworkInfos", _ => GetNetworkInfos(), 5 * 60); /// /// 获取网卡信息 /// /// public static List GetNetworkInfos() { List networkInfos = []; try { // 获取所有网络接口 var interfaces = NetworkInterface.GetAllNetworkInterfaces().ToList(); foreach (var ni in interfaces) { var networkInfo = new NetworkInfo { Name = ni.Name, Description = ni.Description, Type = ni.NetworkInterfaceType.ToString(), OperationalStatus = ni.OperationalStatus.ToString(), Speed = ni.Speed > 0 ? ni.Speed.ToString("#,##0") + " bps" : "Unknown", PhysicalAddress = BitConverter.ToString(ni.GetPhysicalAddress().GetAddressBytes()), SupportsMulticast = ni.SupportsMulticast, IsReceiveOnly = ni.IsReceiveOnly }; try { var properties = ni.GetIPProperties(); networkInfo.DnsAddresses = [.. properties.DnsAddresses.Select(ip => ip.ToString())]; networkInfo.GatewayAddresses = [.. properties.GatewayAddresses.Select(gw => gw.Address.ToString())]; // DHCP服务器地址在macOS上不受支持 if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { networkInfo.DhcpServerAddresses = [.. properties.DhcpServerAddresses.Select(ip => ip.ToString())]; } // IPv4 地址信息 var unicastAddresses = properties.UnicastAddresses.ToList(); networkInfo.IPv4Addresses = [.. unicastAddresses .Where(addr => addr.Address.AddressFamily == AddressFamily.InterNetwork) .Select(addr => new IpAddressInfo { Address = addr.Address.ToString(), SubnetMask = addr.IPv4Mask?.ToString() ?? "", PrefixLength = addr.PrefixLength })]; networkInfo.IPv6Addresses = [.. unicastAddresses .Where(addr => addr.Address.AddressFamily == AddressFamily.InterNetworkV6) .Select(addr => new IpAddressInfo { Address = addr.Address.ToString(), PrefixLength = addr.PrefixLength })]; // 获取网络统计信息 if (ni.OperationalStatus == OperationalStatus.Up) { var stats = ni.GetIPv4Statistics(); networkInfo.Statistics = new NetworkInterfaceStatistics { BytesReceived = stats.BytesReceived, BytesSent = stats.BytesSent, PacketsReceived = stats.UnicastPacketsReceived + stats.NonUnicastPacketsReceived, PacketsSent = stats.UnicastPacketsSent + stats.NonUnicastPacketsSent, IncomingPacketsDiscarded = stats.IncomingPacketsDiscarded, IncomingPacketsWithErrors = stats.IncomingPacketsWithErrors, OutgoingPacketsWithErrors = stats.OutgoingPacketsWithErrors }; // OutgoingPacketsDiscarded在macOS上不受支持 if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { networkInfo.Statistics.OutgoingPacketsDiscarded = stats.OutgoingPacketsDiscarded; } } } catch (Exception ex) { // 如果获取IP属性失败,记录错误信息 Log.Error($"获取网卡 {ni.Name} 的IP属性出错,{ex.Message}"); } if (networkInfo.DhcpServerAddresses.Count == 0 && networkInfo.DnsAddresses.Count == 0 && networkInfo.GatewayAddresses.Count == 0 && networkInfo.IPv4Addresses.Count == 0 && networkInfo.IPv6Addresses.Count == 0) { continue; } networkInfos.Add(networkInfo); } } catch (Exception ex) { // 如果完全失败,返回包含错误信息的空列表 Log.Error("获取网卡信息出错," + ex.Message); networkInfos.Add(new NetworkInfo { Name = "Error", Description = "Failed to retrieve network information" }); } return networkInfos; } } /// /// 网卡信息 /// public record NetworkInfo { /// /// 名称 /// public string Name { get; set; } = string.Empty; /// /// 描述 /// public string Description { get; set; } = string.Empty; /// /// 类型 /// public string Type { get; set; } = string.Empty; /// /// 操作状态 /// public string OperationalStatus { get; set; } = string.Empty; /// /// 速度 /// public string Speed { get; set; } = string.Empty; /// /// 物理地址(mac 地址) /// public string PhysicalAddress { get; set; } = string.Empty; /// /// 是否支持多播 /// public bool SupportsMulticast { get; set; } /// /// 是否只接收 /// public bool IsReceiveOnly { get; set; } /// /// DNS 地址 /// public List DnsAddresses { get; set; } = []; /// /// 网关地址 /// public List GatewayAddresses { get; set; } = []; /// /// DHCP服务器地址 /// public List DhcpServerAddresses { get; set; } = []; /// /// IPv4 地址详细信息 /// public List IPv4Addresses { get; set; } = []; /// /// IPv6 地址详细信息 /// public List IPv6Addresses { get; set; } = []; /// /// 网络接口统计信息 /// public NetworkInterfaceStatistics? Statistics { get; set; } } /// /// IP地址信息 /// public record IpAddressInfo { /// /// IP地址 /// public string Address { get; set; } = string.Empty; /// /// 子网掩码 /// public string SubnetMask { get; set; } = string.Empty; /// /// 前缀长度 /// public int PrefixLength { get; set; } } /// /// 网络接口统计信息 /// public record NetworkInterfaceStatistics { /// /// 接收字节数 /// public long BytesReceived { get; set; } /// /// 发送字节数 /// public long BytesSent { get; set; } /// /// 接收数据包数 /// public long PacketsReceived { get; set; } /// /// 发送数据包数 /// public long PacketsSent { get; set; } /// /// 丢弃的传入数据包数 /// public long IncomingPacketsDiscarded { get; set; } /// /// 丢弃的传出数据包数 /// public long OutgoingPacketsDiscarded { get; set; } /// /// 传入错误数据包数 /// public long IncomingPacketsWithErrors { get; set; } /// /// 传出错误数据包数 /// public long OutgoingPacketsWithErrors { get; set; } } /// /// 网络统计信息 /// public record NetworkStatistics { /// /// 总接收字节数 /// public long TotalBytesReceived { get; set; } /// /// 总发送字节数 /// public long TotalBytesSent { get; set; } /// /// 总接收数据包数 /// public long TotalPacketsReceived { get; set; } /// /// 总发送数据包数 /// public long TotalPacketsSent { get; set; } }