tez*_*tez 13 c linux network-interface
我需要收集所有的接口名称,即使是目前尚未启动的接口名称.喜欢ifconfig -a.
getifaddrs()正在多次迭代相同的接口名称.如何只使用一次收集所有界面名称getifaddrs()?
brm*_*brm 20
您可以检查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);
Run Code Online (Sandbox Code Playgroud)
Hug*_*ues 11
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]
Run Code Online (Sandbox Code Playgroud)
巴姆."tun0"接口上没有AF_PACKET,但它存在于系统上.
相反,您应该使用if_nameindex()系统调用,它完全符合您的要求.换句话说,如果没有参数,它将返回系统上所有接口的列表:
#include <net/if.h>
#include <stdio.h>
void 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 ;
}
Run Code Online (Sandbox Code Playgroud)
瞧.
似乎ifconfig -a只列出了活动接口(至少在Fedora 19上).我知道我至少还有一张我看不到的网卡.无论如何,我得到的列表如下:
ls -1 /sys/class/net
Run Code Online (Sandbox Code Playgroud)
这可以很容易地以编程方式完成.