SIOCGIFCONF 只返回环回接口

Posted

技术标签:

【中文标题】SIOCGIFCONF 只返回环回接口【英文标题】:SIOCGIFCONF return only loopback interface 【发布时间】:2018-03-04 15:59:36 【问题描述】:

我想获取系统上存在的所有网络接口名称。对于系统可移植性(包括 android),我决定编写一个使用ioctl 执行此任务的方法,因为我认为(可能是错误的)ioctl 是最适合此任务的方法之一。所以我写了这段代码

struct ifconf contr_req;
contr_req.ifc_ifcu.ifcu_req = NULL;
if(ioctl(sock,SIOCGIFCONF,&contr_req) < 0)
    return NULL;


contr_req.ifc_ifcu.ifcu_buf = malloc(contr_req.ifc_len);
register int len = contr_req.ifc_len/sizeof(struct ifreq);
char **names = malloc(sizeof(char*)*len);

if(ioctl(sock,SIOCGIFCONF,&contr_req) < 0)
    return NULL;

struct ifreq *ini;
for(int i = 0;i < len; i++)
    ini = contr_req.ifc_ifcu.ifcu_req +
                sizeof(struct ifreq)*i;

    register name_len = strlen(ini->ifr_ifrn.ifrn_name)+1;
    names[i] = malloc(name_len);
    memset(names[i],0,name_len);
    memcpy(names[i],ini->ifr_ifrn.ifrn_name,name_len-1);


return names;

但问题是,它只返回环回接口。谁能解释错误在哪里,或者是否有另一个 ioctl 条目来返回系统上的所有接口名称?

(我不想使用getifaddrif_nameindex,而是使用ioctl。)

【问题讨论】:

一个建议:不要使用register。编译器在分配寄存器方面要好得多,并且该关键字已经过时了。此外,它不应该出现在示例代码中,除非它确实是必需的。 【参考方案1】:

ioctl 调用会重新运行所有接口,但您看不到它们,因为您从错误的点开始检查结果。您需要迭代您之前分配的缓冲区 contr_req.ifc_ifcu.ifcu_buf

所以改变这个:

ini = contr_req.ifc_ifcu.ifcu_req +
            sizeof(struct ifreq)*i;

到这里:

 ini = (struct ifreq *)((char *)contr_req.ifc_ifcu.ifcu_buf +
            sizeof(struct ifreq)*i);

【讨论】:

它不会返回所有接口,因为 contr_req.ifc_len/sizeof(struct ifreq) 是 1【参考方案2】:

最后我发现 SIOCGIFCONF 只返回连接的接口。

【讨论】:

以上是关于SIOCGIFCONF 只返回环回接口的主要内容,如果未能解决你的问题,请参考以下文章

linux上的环回接口地址是多少?

ospf中提到环回接口是啥?怎样设置环回接口?

环回接口以及MTU

环回接口---loopback

MTU对环回接口的意义

ngrep环回接口数据抓取方法,使用-d lo参数