应采用双层校验法:优先匹配NetworkInterfaceType.Wireless80211,其次分析Description关键词(如“Wi-Fi”“Ethernet”),再结合OperationalStatus.Up、非空单播地址、网关存在性及DHCP服务等状态综合判定,排除虚拟网卡干扰。

用 NetworkInterface 看接口类型,但别只看 NetworkInterfaceType
直接调 NetworkInterface.GetPhysicalAddress() 或查 NetworkInterfaceType 枚举值,容易误判。比如有些 USB 无线网卡报告为 NetworkInterfaceType.Ethernet,而某些雷电/USB-C 有线扩展坞又可能被识别成 NetworkInterfaceType.Other。
-
NetworkInterfaceType.Wireless80211是可靠信号,代表 WiFi;但没匹配到不等于不是 WiFi -
NetworkInterfaceType.Ethernet大概率是有线,但需配合OperationalStatus == OperationalStatus.Up和物理地址有效性(非全 0)一起判断 - 优先过滤掉
Loopback、Tunnel、Unknown类型接口,它们不参与真实上网 - 遍历时建议按
NetworkInterface.GetIsNetworkAvailable()为前提,避免空转无效接口
靠 GetIPProperties().GetIPv4Properties().Index 结合系统 API 更准
Windows 底层的 GetAdaptersAddresses(封装在 IP_ADAPTER_ADDRESSES 结构里)能返回 Ipv4Enabled、ConnectionType(如 IF_CONNECTION_DEDICATED / IF_CONNECTION_PASSIVE),但 .NET 没直接暴露。所以得用 P/Invoke 调 wininet.dll 的 InternetGetConnectedState 辅助交叉验证:
-
InternetGetConnectedState返回的flags中含INTERNET_CONNECTION_LAN,通常对应有线或稳定局域网接入,但不区分 WiFi/以太网 - 它无法识别纯内网无外网的 WiFi(比如连着但没配网关),此时会返回
false,造成漏判 - 该 API 已被标记为 legacy,Win10+ 上行为不稳定,尤其在多网卡、Hyper-V 虚拟网卡共存时易误报
实际项目中推荐「双层校验」:状态 + 名称关键词
光靠枚举值或单个 API 都有死角,稳妥做法是把接口描述(Description)、名称(Name)、类型(NetworkInterfaceType)、物理状态(OperationalStatus)组合起来打分判断:
- 若
NetworkInterfaceType == Wireless80211→ 直接标 WiFi - 若
Description含"Wi-Fi"、"Wireless"、"802.11"(忽略大小写)→ 倾向 WiFi - 若
Description含"Ethernet"、"Realtek"、"Intel I219"、"RTL8168"等常见有线网卡厂商名 → 倾向有线 - 必须同时满足
OperationalStatus == OperationalStatus.Up且GetIPProperties().UnicastAddresses.Count > 0,否则跳过该接口
别忘了虚拟网卡和热点共享的干扰
Windows 自带的“移动热点”、WSL2 的 vEthernet、Docker 的 Hyper-V 网络、甚至某些杀毒软件添加的过滤驱动网卡,都会出现在 GetAllNetworkInterfaces() 列表里。它们常表现为 NetworkInterfaceType.Other + OperationalStatus.Up,但根本不能上网。
- 用
GetIPProperties().GatewayAddresses是否非空来辅助筛——真上网的接口一般有默认网关 - 检查
GetIPProperties().DhcpServerAddresses,有 DHCP 服务更可能是用户主连接(而非虚拟网卡) - 如果程序需要高置信度识别,建议加一层 ping 测试:对
8.8.8.8和本地网关各发一次Ping.Send(),再结合接口类型做最终归类
真正难的不是识别 WiFi 还是有线,而是当多个活跃接口并存时(比如笔记本连着 WiFi 又插着 USB 网卡),系统到底走哪条路——这时候得看路由表,而不是只看接口本身。










