我需要收集所有的界面名称,即使是那些目前还没有运行的。就像ifconfig -a。
getifaddrs()多次迭代相同的接口名称。如何使用getifaddrs()只收集一次所有接口名称
发布于 2013-10-07 15:00:47
您可以检查来自getifaddrs的哪些条目属于AF_PACKET家族。在我的系统中,它似乎列出了所有接口:
struct ifaddrs *addrs,*tmp;
getifaddrs(&addrs);
tmp = addrs;
while (tmp)
{
if (tmp->ifa_addr && tmp->ifa_addr->sa_family == AF_PACKET)
printf("%s\n", tmp->ifa_name);
tmp = tmp->ifa_next;
}
freeifaddrs(addrs);发布于 2017-08-21 11:56:15
getifaddrs()只返回接口地址,而不返回接口本身。
如果您的任何接口没有地址,或者没有被请求家庭的地址,就像“AF_PACKET”接口所建议的那样怎么办?
这里是一个示例,其中我获得了一个隧道接口(带有OpenVPN连接),并列出了每个网络接口的getifaddrs()中的所有条目:
[0] 1: lo address family: 17 (AF_PACKET) b4:11:00:00:00:01
address family: 2 (AF_INET) address: <127.0.0.1>
address family: 10 (AF_INET6) address: <::1>
[...]
[5] 10: tun0 address family: 2 (AF_INET) address: <172.16.0.14>
[EOF]Bam。在“AF_PACKET”接口上没有tun0,但它确实存在于系统中。
相反,您应该使用if_nameindex() syscall,它完全可以满足您的需要。换句话说,在没有参数的情况下,它返回系统上所有接口的列表:
#include <net/if.h>
#include <stdio.h>
int main (void)
{
struct if_nameindex *if_nidxs, *intf;
if_nidxs = if_nameindex();
if ( if_nidxs != NULL )
{
for (intf = if_nidxs; intf->if_index != 0 || intf->if_name != NULL; intf++)
{
printf("%s\n", intf->if_name);
}
if_freenameindex(if_nidxs);
}
return 0;
}还有哇哦。
发布于 2013-10-07 15:46:10
ifconfig -a似乎只列出了活动接口(至少在Fedora 19上)。我知道我至少还有一张我看不到的网卡。不管怎么说,我得到的清单和:
ls -1 /sys/class/net这可以很容易地通过编程完成。
https://stackoverflow.com/questions/19227781
复制相似问题