关于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
相关产品推荐
相关产品推荐

