using System; using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Runtime.InteropServices; namespace CZGL.SystemInfo { /// /// 网络接口信息 /// public class NetworkInfo { private NetworkInterface _instance; private NetworkInfo(NetworkInterface network) { _instance = network; } /// /// 当前实例使用的网络接口 /// public NetworkInterface NetworkInterface => _instance; #region 基础信息 /// /// 获取网络适配器的标识符 /// /// ex:{92D3E528-5363-43C7-82E8-D143DC6617ED} public string Id => _instance.Id; /// /// 网络的 Mac 地址 /// /// ex: 1C997AF108E3 public string Mac => _instance.GetPhysicalAddress().ToString(); /// /// 网卡名称 /// /// ex:以太网,WLAN public string Name => _instance.Name; /// /// 描述网络接口的用户可读文本, /// 在 Windows 上,它通常描述接口供应商、类型 (例如,以太网) 、品牌和型号; /// /// ex:Realtek PCIe GbE Family Controller、 Realtek 8822CE Wireless LAN 802.11ac PCI-E NIC public string Trademark => _instance.Description; /// /// 获取网络连接的当前操作状态
///
public OperationalStatus Status => _instance.OperationalStatus; /// /// 获取网卡接口类型
///
public NetworkInterfaceType NetworkType => _instance.NetworkInterfaceType; /// /// 网卡链接速度,每字节/秒为单位 /// /// 如果是-1,则说明无法获取此网卡的链接速度;例如 270_000_000 表示是 270MB 的链接速度 public long Speed => _instance.Speed; /// /// 是否支持 Ipv4 /// public bool IsSupportIpv4 => _instance.Supports(NetworkInterfaceComponent.IPv4); /// /// 获取分配给此接口的任意广播 IP 地址。只支持 Windows /// /// 一般情况下为空数组 public IPAddress[] AnycastAddresses { get { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { return _instance.GetIPProperties().AnycastAddresses.Select(x => x.Address).ToArray(); } else { return Array.Empty(); } } } /// /// 获取分配给此接口的多播地址,ipv4、ipv6 /// /// ex:ff01::1%9 ff02::1%9
/// ff02::fb%9
/// ff02::1:3%9
/// ff02::1:ff61:9ae7%9
/// 224.0.0.1
public IPAddress[] MulticastAddresses => _instance.GetIPProperties().MulticastAddresses.Select(x => x.Address).ToArray(); /// /// 获取分配给此接口的单播地址,ipv4、ipv6 /// /// ex:192.168.3.38 public IPAddress[] UnicastAddresses => _instance.GetIPProperties().UnicastAddresses.Select(x => x.Address).ToArray(); /// /// 获取此接口的 IPv4 网关地址,ipv4、ipv6 /// /// ex:fe80::1677:40ff:fef9:bf95%5、192.168.3.1 public IPAddress[] GatewayAddresses => _instance.GetIPProperties().GatewayAddresses.Select(x => x.Address).ToArray(); /// /// 获取此接口的域名系统 (DNS) 服务器的地址,ipv4、ipv6 /// /// ex:fe80::1677:40ff:fef9:bf95%5、192.168.3.1 public IPAddress[] DnsAddresses => _instance.GetIPProperties().DnsAddresses.ToArray(); /// /// 是否支持 Ipv6 /// public bool IsSupportIpv6 => _instance.Supports(NetworkInterfaceComponent.IPv6); #endregion /// /// 当前主机是否能够与其他计算机通讯(公网或内网),如果任何网络接口标记为 "up" 且不是环回或隧道接口,则认为网络连接可用。 /// public static bool GetIsNetworkAvailable => NetworkInterface.GetIsNetworkAvailable(); /// /// 计算 IPV4 的网络流量 /// /// /// 当前网卡不支持 IPV4 public Rate GetIpv4Speed() { // 当前网卡不支持 IPV4 if (!IsSupportIpv4) return default; var ipv4Statistics = _instance.GetIPv4Statistics(); var speed = new Rate(DateTime.Now, ipv4Statistics.BytesReceived, ipv4Statistics.BytesSent); return speed; } /// /// 计算 IPV4 、IPV6 的网络流量 /// /// public Rate IpvSpeed() { var ipvStatistics = _instance.GetIPStatistics(); var speed = new Rate(DateTime.Now, ipvStatistics.BytesReceived, ipvStatistics.BytesSent); return speed; } /// /// 获取所有 IP 地址 /// /// public static IPAddress[] GetIPAddresses() { var hostName = Dns.GetHostName(); return Dns.GetHostAddresses(hostName); } /// /// 获取当前真实 IP /// /// public static IPAddress TryGetRealIpv4() { var addrs = GetIPAddresses(); var ipv4 = addrs.FirstOrDefault(x => x.AddressFamily == AddressFamily.InterNetwork); return ipv4; } /// /// 获取真实网卡 /// /// public static NetworkInfo TryGetRealNetworkInfo() { var realIp = TryGetRealIpv4(); if (realIp == null) { return default; } var infos = NetworkInfo.GetNetworkInfos().ToArray(); var info = infos.FirstOrDefault(x => x.UnicastAddresses.Any(i => i.MapToIPv4().ToString() == realIp.MapToIPv4().ToString())); if (info == null) { return default; } return info; } /// /// 获取此主机中所有网卡接口 /// /// public static NetworkInfo[] GetNetworkInfos() { return NetworkInterface.GetAllNetworkInterfaces().Select(x => new NetworkInfo(x)).ToArray(); } /// /// 计算网络流量速率 /// /// /// /// public static (SizeInfo Received, SizeInfo Sent) GetSpeed(Rate oldRate, Rate newRate) { var receive = newRate.ReceivedLength - oldRate.ReceivedLength; var send = newRate.SendLength - oldRate.SendLength; var interval = Math.Round((newRate.StartTime - oldRate.StartTime).TotalSeconds, 2); long rSpeed = (long)(receive / interval); long sSpeed = (long)(send / interval); return (SizeInfo.Get(rSpeed), SizeInfo.Get(sSpeed)); } } }