SIOCGIFCONF仅返回环回接口

时间:2018-03-04 15:59:36

标签: linux ioctl network-interface

我想获得系统中存在的所有网络接口名称。为了系统可移植性(包括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_nameindexioctl。)

2 个答案:

答案 0 :(得分:0)

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);

答案 1 :(得分:0)

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