Linux getting all network interface names

前端 未结 6 1947
傲寒
傲寒 2020-12-01 08:30

I need to collect all the interface names, even the ones that aren\'t up at the moment. Like ifconfig -a.

getifaddrs() is iterating through

6条回答
  •  时光说笑
    2020-12-01 09:12

    getifaddrs() will only return your interfaces addresses, not the interfaces themselves.

    What if any of your interface has no address, or no address of the requested family, as suggested with the 'AF_PACKET' one ?

    Here, an example where I’ve got a tunnel interface (with an OpenVPN connexion), and where I’m listing all entries from getifaddrs() for each of my network interfaces:

    [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. No AF_PACKET on the "tun0" interface, but it DOES exist on the system.

    You should, instead, use if_nameindex() syscall, which does exactly what you want. In other words, with no arguments, it returns a list of all interfaces on your system:

    #include 
    #include 
    
    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;
    }
    

    And voilà.

提交回复
热议问题