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

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

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

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

编辑

详细说明问题。 基本上,在做ifconfig我可以得到这样的东西:

 eth0链接封装:以太网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范围:链接
 UP BROADCAST RUNNING MULTICAST MTU:1500公制:1
 RX数据包:14785错误:0丢弃:0超限:0帧:0
 TX数据包:429错误:0丢弃:0溢出:0载波:0
碰撞:0 txqueuelen:1000
 RX字节:961439(938.9 KiB)TX字节:71866(70.1 KiB)
中断:67基地址:0x2000

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

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

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

希望我能正确解释一下。

您可以尝试使用Netlink的RTNETLINK( 1,2 )。 有关示例 ,请参阅使用RTNETLINK操作网络环境 。

没有返回链接封装的ioctl ,如果您对ifconfig进行了分析或查看其源代码,您将看到它使用表查找来查找链接封装的名称。 这是来自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 .... 

一个简单的方法是:

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头文件。

真的很广泛的问题。

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

与问题无关但是,如果有人想在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