You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Unix机器中SIOCGIFCONF是否仅返回已连接接口的技术问询

SIOCGIFCONF 是否仅返回已连接的接口?

其实这个问题的答案不能一概而论——SIOCGIFCONF 并不会只返回已连接互联网的接口,但它返回的接口范围完全取决于你使用的 Unix-like 系统和内核版本,不同实现差异很大:

  • BSD 系系统(FreeBSD、OpenBSD 等):
    早期的 SIOCGIFCONF 只会返回已启用(up 状态)且配置了地址的接口,但新版本的实现已经调整,大部分会返回所有存在的接口,哪怕是未配置地址但处于 up 状态的。不过完全 down 掉的接口还是可能被过滤掉。

  • Linux 系统的行为变化:

    • 2.4 及更早内核:SIOCGIFCONF 只返回带有 IPv4 地址的接口,不管接口是否处于 up 状态——也就是说,如果你的接口没配置 IP,哪怕是 up 的,也不会被返回。这可能就是你觉得它只返回已连接(带IP)和回环(默认有IP)接口的原因。
    • 2.6 及以后内核:如果你使用扩展的 ifconf 结构体(比如设置足够大的 ifc_len,并指定 AF_UNSPEC 地址族),它会返回更多接口,包括没有 IPv4 地址但有其他地址族(比如 IPv6)的接口,但仍然可能漏掉完全处于 down 状态的接口。

如果你想要获取系统中所有存在的网络接口(不管是否配置IP、是否处于up状态),更可靠的方案是:

  • 使用 getifaddrs() 函数:这是 POSIX 标准接口,兼容性好,能返回所有接口的详细信息,包括没有绑定任何地址的接口。
  • Linux 下还可以直接读取 /sys/class/net/ 目录:这个目录下的每个子目录对应一个网络接口,不管接口状态如何,直接遍历就能拿到所有接口名称,简单高效。

给你一个用 getifaddrs() 获取接口名称的简单示例:

#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    struct ifaddrs *ifap, *ifa;

    if (getifaddrs(&ifap) == -1) {
        perror("getifaddrs");
        exit(EXIT_FAILURE);
    }

    for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
        // 打印所有接口名称,不管是否有地址
        printf("接口: %s\n", ifa->ifa_name);
    }

    freeifaddrs(ifap);
    return EXIT_SUCCESS;
}

内容的提问来源于stack exchange,提问作者P.Carlino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:41:14