上一篇
C中怎样快速获取当前网络连接名称?
- 行业动态
- 2025-05-14
- 4
在C#中可通过System.Net.NetworkInformation命名空间获取网络连接信息,使用NetworkInterface.GetAllNetworkInterfaces()遍历网络接口,筛选OperationalStatus属性为Up的接口,通过Name属性即可获取活动网络连接的名称列表,如以太网或Wi-Fi标识。
使用WMI查询网络适配器信息
Windows Management Instrumentation(WMI)是Windows系统提供的一种管理接口,可通过查询Win32_NetworkAdapter
类获取网络连接详细信息。
using System.Management; public List<string> GetNetworkConnectionsByWMI() { List<string> connections = new List<string>(); ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus=2"); foreach (ManagementObject obj in searcher.Get()) { string name = obj["NetConnectionId"]?.ToString(); if (!string.IsNullOrEmpty(name)) { connections.Add(name); } } return connections; }
说明
NetConnectionStatus=2
表示仅筛选已连接的适配器。- 需引用
System.Management
命名空间,并在项目中添加System.Management.dll依赖。
使用NetworkInterface类
.NET框架内置的System.Net.NetworkInformation
命名空间提供了NetworkInterface
类,可更高效地获取网络接口信息。
using System.Net.NetworkInformation; public List<string> GetNetworkConnectionsByNetworkInterface() { List<string> connections = new List<string>(); foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) { if (ni.OperationalStatus == OperationalStatus.Up && ni.NetworkInterfaceType != NetworkInterfaceType.Loopback) { connections.Add(ni.Name); } } return connections; }
优点
- 直接集成在.NET框架中,无需额外依赖。
- 支持跨平台(在非Windows系统中需注意兼容性)。
调用Windows API(适用于高级场景)
通过调用iphlpapi.dll
中的GetAdaptersInfo
函数,可获取更底层的网络适配器信息。
using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public struct IP_ADAPTER_INFO { public IntPtr Next; public int ComboIndex; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string AdapterName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 132)] public string Description; // 其他字段省略 } [DllImport("iphlpapi.dll", CharSet = CharSet.Auto)] public static extern int GetAdaptersInfo(IntPtr pAdapterInfo, ref int pOutBufLen); public List<string> GetNetworkConnectionsByWinAPI() { int bufferSize = 0; GetAdaptersInfo(IntPtr.Zero, ref bufferSize); IntPtr pAdapterInfo = Marshal.AllocHGlobal(bufferSize); List<string> connections = new List<string>(); if (GetAdaptersInfo(pAdapterInfo, ref bufferSize) == 0) { IntPtr current = pAdapterInfo; while (current != IntPtr.Zero) { IP_ADAPTER_INFO adapter = Marshal.PtrToStructure<IP_ADAPTER_INFO>(current); connections.Add(adapter.Description); current = adapter.Next; } } Marshal.FreeHGlobal(pAdapterInfo); return connections; }
适用场景
- 需要获取MAC地址、IP地址等扩展信息时。
- 需处理复杂的网络配置。
最佳实践与注意事项
- 权限问题
使用WMI或Windows API时,可能需要以管理员权限运行程序。 - 异常处理
添加try-catch
块捕获ManagementException
或Win32Exception
异常。 - 结果去重
部分系统可能返回重复的适配器名称,需根据实际需求过滤。 - 兼容性
NetworkInterface
类在Linux/macOS下可能返回不同的结果,需测试多平台行为。
- 简单场景:优先使用
NetworkInterface
类,代码简洁且跨平台兼容。 - 深度需求:结合WMI或Windows API获取详细信息。
- 无论选择哪种方法,都需根据实际环境处理权限和异常。
参考资料
- Microsoft Docs – NetworkInterface Class
- WMI Query Guide – Win32_NetworkAdapter
- Windows API Documentation – GetAdaptersInfo Function