最可靠方式是调用getiftable2(windows)或读取/sys/class/net/*/operstate(linux),分别通过ifoperstatus和operstate字段判断物理链路状态,需组合ip配置等指标综合判定“已连接”。

Windows 上用 GetIfTable2 获取适配器运行状态
Windows 下最可靠的方式是调用 GetIfTable2(推荐)或 GetIfEntry2,它们能直接读取内核级网络接口状态,比轮询 IsNetworkAlive 或 ping 网关更准确。注意:必须链接 iphlpapi.lib,且需 Windows Vista+ 系统。
关键字段是 ifOperStatus,值为 IF_OPER_STATUS_UP 表示物理链路已连接(网线插着或 Wi-Fi 已关联),IF_OPER_STATUS_DOWN 表示断开。它不关心 IP 是否配置成功,只反映底层链路层状态。
- 调用前用
InitializeCriticalSection不必要,但需检查返回值是否为NO_ERROR -
GetIfTable2返回的是按索引排序的数组,遍历每个PMIB_IF_ROW2时,用row->InterfaceDescription或row->Alias匹配适配器名称(如 “Wi-Fi” 或 “以太网”) - 不要依赖
ifAdminStatus——它是管理员手动禁用/启用的状态,和实际物理连接无关
Linux 下读取 /sys/class/net/*/operstate
Linux 没有统一 API,最轻量、最稳定的做法是读取 sysfs 虚拟文件系统:/sys/class/net/<var>iface_name</var>/operstate。该文件内容为纯文本,常见值有 up、down、unknown、dormant 等。
up 表示链路已建立(等价于 Windows 的 IF_OPER_STATUS_UP),down 表示物理断开;unknown 多见于未初始化的虚拟接口(如刚创建的 bridge),不能当作“未连接”处理。
- 路径中
<var>iface_name</var>需从/sys/class/net/目录枚举获得,跳过lo和其他非物理接口(如veth*、docker0) - 避免用
system("ip link show")解析输出——shell 启动开销大,且不同发行版ip版本输出格式可能微调 - 注意权限:普通用户可读
/sys/class/net/*/operstate,无需 root
跨平台封装时别混淆 operstate 和 carrier
Linux 还提供 /sys/class/net/<var>iface_name</var>/carrier,其值为 1 或 0,语义更接近 Windows 的 ifOperStatus:仅反映物理层是否有信号(网线插没插、Wi-Fi 是否关联)。而 operstate 可能受协议栈影响(比如 DHCP 失败后某些驱动仍报 up)。
- 若只需判断“网线是否插好”或“Wi-Fi 是否连上 AP”,优先读
carrier;若需知道“OS 是否认为该接口可用”,用operstate - macOS 没有直接对应项,得用
SCNetworkInterfaceCopyAll()+SCNetworkInterfaceGetStatus(),返回kSCNetworkInterfaceStatusActive才算已连接 - C++ 封装时,建议抽象出
is_link_up()(对应 carrier/IF_OPER_STATUS_UP)和is_configured()(检查是否有 IPv4/IPv6 地址)两个函数,别混成一个“is_connected()”
常见误判场景和绕过方法
单纯查状态容易掉坑:Wi-Fi 适配器显示 up,但 SSID 为空或认证失败;有线网卡 carrier=1,但 DHCP 卡住导致无 IP;或者容器内 netns 里看到的接口状态和宿主机不一致。
- 不要只看单个指标——建议组合判断:
carrier == 1 && has_ipv4_address()(Linux)或ifOperStatus == IF_OPER_STATUS_UP && row->Ipv4AddressLength > 0(Windows) - Windows 下某些 USB 网卡驱动上报
IF_OPER_STATUS_UNKNOWN,此时应回退查ifAdminStatus和ifLastChange时间戳变化 - 轮询间隔别低于 1 秒——频繁调用
GetIfTable2或反复 open/read sysfs 文件会触发内核锁争用,尤其在多线程环境下
真正难的不是读状态,而是定义清楚“什么叫已连接”:是物理链路通?IP 配置好?还是能 DNS 解析?不同业务需求得各自加一层语义判断,别指望操作系统替你做决策。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











