如何获取以太网设备列表

时间:2014-05-15 02:58:04

标签: c linux networking network-programming

我希望使用C程序获取系统上的以太网设备列表。在我的系统中,我想获得eth0-9的列表,如果可能的话还有一些相关的属性(例如MAC addr,支持最大速度)。

# ip link show | grep " eth"
3: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
5: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
6: eth3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
7: eth4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
8: eth5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
14: eth6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
15: eth7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
16: eth8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
17: eth9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000

在网上搜索,我发现代码示例类似于以下内容:

char          buf[1024];
struct ifconf ifc;
int           sck;

/* Get a socket handle. */
sck = socket(AF_INET, SOCK_DGRAM, 0);

/* Query available interfaces. */
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
ioctl(sck, SIOCGIFCONF, &ifc);

但是,上述代码仅检索为其分配了IP地址的eth设备列表。我想获得一个完整的eth设备列表,无论是否分配了IP地址。

我在glibc中也遇到了以下函数:

struct if_nameindex * if_nameindex(void);

但是,上面的函数只返回eth设备索引和名称(如ethX中所示),这是非常有限的信息。

是否有其他/更好的选择。

为了明确我的目标,我想从系统中获取eth设备列表,并且只选择10G端口的eth设备。

谢谢你, 艾哈迈德。

1 个答案:

答案 0 :(得分:2)

您正在寻找getifaddrs。在手册页的底部是一个示例程序,演示如何遍历所有接口。您可以在联合或相关功能中使用if_nameindexif_nametoindexif_indextonameif_freenameindex