首页 文章

通过C程序获取Linux中的网络接口类型

提问于
浏览
2

如何从Linux中的C程序获取网络接口的类型名称?

我尝试使用 getifaddr 来访问网络接口,我得到了我需要的一切,除了它的类型名称 . 有什么想法可以做到吗?

我还是Linux的新手,所以对任何变通办法或示例代码的任何评论都会受到赞赏 .

编辑

详述这个问题 . 基本上,在做 ifconfig 时,我可以得到这样的东西:

eth0 Link encap:Ethernet HWaddr 00:0C:29:40:93:9C
inet addr:192.168.154.102 Bcast:192.168.154.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe40:939c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:14785 errors:0 dropped:0 overruns:0 frame:0
TX packets:429 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:961439 (938.9 KiB) TX bytes:71866 (70.1 KiB)
Interrupt:67 Base address:0x2000

以下是我理解eth0是接口名称 . 虽然可以有多个网络接口(eth0,eth1,eth2)和几个虚拟接口(tap0,tap1等)和无线接口,但它们都是以太网接口 .

环回也一样,作为接口名称,其接口是Local Loopback .

所以问题是,我怎样才能使用C程序打印出eth0,tap0,wlan0属于以太网类型,并且lo - >到本地环回类型,当我事先不知道使用了什么接口以及有多少接口时他们在机器里 .

希望我能正确解释一下 .

5 回答

  • 1

    您可以尝试使用Netlink的RTNETLINK(12) . 有关示例,请参阅Manipulating the Networking Environment Using RTNETLINK .

  • 0

    没有 ioctl 返回链接封装,如果您 strace ifconfig或查看其source代码,您将看到它使用表查找来查找链接封装的名称 . 这是来自net-tools源代码,因为您可以看到名称是静态初始化的:

    //lib/hw.c
    void hwinit()
    {
        loop_hwtype.title = _("Local Loopback");
        unspec_hwtype.title = _("UNSPEC");
    #if HAVE_HWSLIP
        slip_hwtype.title = _("Serial Line IP");
        cslip_hwtype.title = _("VJ Serial Line IP");
        slip6_hwtype.title = _("6-bit Serial Line IP");
        cslip6_hwtype.title = _("VJ 6-bit Serial Line IP");
        adaptive_hwtype.title = _("Adaptive Serial Line IP");
    #endif
    #if HAVE_HWETHER
        ether_hwtype.title = _("Ethernet");
    #endif
    ....
    
  • 1

    一个简单的方法是:

    cat / sys / class / net / X / type

    (其中X是你的netdev名称,例如eth0)

    然后将数字与:http://lxr.linux.no/linux+v3.0/include/linux/if_arp.h#L30进行比较

    例如:

    cat / sys / class / net / eth0 / type

    输出:

    1

    =>其中1 = ARPHRD_ETHER符合if_arp.h头文件 .

  • 0

    真的很广泛的问题 .

    在Linux下,操作系统本身可以被认为是一个网络接口,所谓的"loopback interfaces"承认这种选择,它们是"network interfaces",即使它们是虚拟的而不是真正的硬件,它们看起来与你的PCI网卡或USB加密狗相同 . 如果您正在寻找网络硬件,建议您查看 lshw 或花时间研究内核如何与网络资源进行自身接口 .

  • 3

    与问题无关,但是,如果有人想在shell上找到它,这里有一种方法可以找到wifi接口:

    for iface in ` ifconfig | cut -f 1 -d ' ' | sort | grep -v '^$'`
    do
    if [ -d /sys/class/net/$iface/wireless ];then echo $iface ; fi
    done
    

相关问题