当前位置:首页 > 行业动态 > 正文

C中怎样快速获取当前网络连接名称?

在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地址等扩展信息时。
  • 需处理复杂的网络配置。

最佳实践与注意事项

  1. 权限问题
    使用WMI或Windows API时,可能需要以管理员权限运行程序。
  2. 异常处理
    添加try-catch块捕获ManagementExceptionWin32Exception异常。
  3. 结果去重
    部分系统可能返回重复的适配器名称,需根据实际需求过滤。
  4. 兼容性
    NetworkInterface类在Linux/macOS下可能返回不同的结果,需测试多平台行为。

  • 简单场景:优先使用NetworkInterface类,代码简洁且跨平台兼容。
  • 深度需求:结合WMI或Windows API获取详细信息。
  • 无论选择哪种方法,都需根据实际环境处理权限和异常。

参考资料

  1. Microsoft Docs – NetworkInterface Class
  2. WMI Query Guide – Win32_NetworkAdapter
  3. Windows API Documentation – GetAdaptersInfo Function
0