首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux获取所有网络接口名称

问Linux获取所有网络接口名称
EN

Stack Overflow用户
提问于 2013-10-07 14:43:47
回答 7查看 38K关注 0票数 20

我需要收集所有的界面名称,即使是那些目前还没有运行的。就像ifconfig -a。

getifaddrs()多次迭代相同的接口名称。如何使用getifaddrs()只收集一次所有接口名称

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-10-07 15:00:47

您可以检查来自getifaddrs的哪些条目属于AF_PACKET家族。在我的系统中,它似乎列出了所有接口:

代码语言:javascript
复制
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);
票数 31
EN

Stack Overflow用户

发布于 2017-08-21 11:56:15

getifaddrs()只返回接口地址,而不返回接口本身。

如果您的任何接口没有地址,或者没有被请求家庭的地址,就像“AF_PACKET”接口所建议的那样怎么办?

这里是一个示例,其中我获得了一个隧道接口(带有OpenVPN连接),并列出了每个网络接口的getifaddrs()中的所有条目:

代码语言:javascript
复制
[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,它完全可以满足您的需要。换句话说,在没有参数的情况下,它返回系统上所有接口的列表:

代码语言:javascript
复制
#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;
}

还有哇哦。

票数 22
EN

Stack Overflow用户

发布于 2013-10-07 15:46:10

ifconfig -a似乎只列出了活动接口(至少在Fedora 19上)。我知道我至少还有一张我看不到的网卡。不管怎么说,我得到的清单和:

代码语言:javascript
复制
ls -1 /sys/class/net

这可以很容易地通过编程完成。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19227781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档