如何从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 - >到本地环回类型,当我事先不知道使用了什么接口以及它们中有多少接口时。
希望我能正确解释一下。
答案 0 :(得分:3)
您可以尝试使用Netlink的RTNETLINK(1,2)。 有关示例,请参阅Manipulating the Networking Environment Using RTNETLINK。
答案 1 :(得分:1)
没有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
....
答案 2 :(得分: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头文件。
答案 3 :(得分:0)
真的很广泛的问题。
在linux下,操作系统本身可以被认为是一个网络接口,所谓的“环回接口”承认这种选择,它们是“网络接口”,即使它们是虚拟的而不是真正的硬件,它们看起来是一样的作为您的PCI网卡或USB加密狗。如果您正在寻找网络硬件,建议您查看lshw
或花时间研究内核如何与网络资源接口。
答案 4 :(得分:0)
与问题无关,但是,如果有人想在shell上找到它,这里有一种方法可以找到wifi接口:
//working check if set
$wa_passwordreset = WA_FN_Validate_Post($_POST['wa_passwordreset']);
if(isset($wa_passwordreset))
{
echo"do some stuff";
}
//NOT working check if set
if(isset( WA_FN_Validate_Post($_POST['wa_passwordreset']) ))
{
echo"do some other stuff";
}