SIOCGIFCONF return 仅环回接口
SIOCGIFCONF return only loopback 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;
但问题是,它 return 只是环回接口。任何人都可以解释错误在哪里,或者系统上是否还有 return 所有接口名称的另一个 ioctl
条目?
(我不想使用 getifaddr
或 if_nameindex
但 ioctl
。)
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);
最后我发现 SIOCGIFCONF returns 只有连接的接口。
我想获取系统上存在的所有网络接口名称。为了系统可移植性(包括 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;
但问题是,它 return 只是环回接口。任何人都可以解释错误在哪里,或者系统上是否还有 return 所有接口名称的另一个 ioctl
条目?
(我不想使用 getifaddr
或 if_nameindex
但 ioctl
。)
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);
最后我发现 SIOCGIFCONF returns 只有连接的接口。