Linux获取所有网络接口名称

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)

瞧.

  • 您的示例代码泄漏了内存.根据文档([if_nameindex](http://man7.org/linux/man-pages/man3/if_nameindex.3.html))if_nameindex()函数动态分配以后应该通过调用if_freenameindex()释放的内存. (3认同)

lda*_*v1s 5

似乎ifconfig -a只列出了活动接口(至少在Fedora 19上).我知道我至少还有一张我看不到的网卡.无论如何,我得到的列表如下:

ls -1 /sys/class/net
Run Code Online (Sandbox Code Playgroud)

这可以很容易地以编程方式完成.