在Linux上:如何以编程方式确定是否已启用并插入NIC接口?

时间:2010-07-09 20:50:36

标签: linux network-programming

我想确定网卡是否已启用,启动和插入。基本上,我想知道网卡是否可以正常工作。我需要使用C ++程序提供此信息,并希望在网络无法正常工作时显示错误消息。如果可能,我想避免使用shell命令来确定此信息。

5 个答案:

答案 0 :(得分:16)

您可以查看/sys/class/net/eth0/operstate其中eth0是您的界面,看看它是否已启动。

查看/sys/class/net/eth0/carrier以查看是否有运营商。

虽然我想执行ifconfig并且朋友会给你更多兼容* BSD。

答案 1 :(得分:5)

  1. 打开AF_NETLINK套接字
  2. 使用sockaddr_nl
  3. 将其绑定到nl_groups = RTMGRP_LINK
  4. 将消息RTM_GETLINK发送给内核
  5. 在套接字上进行poll / epoll以阅读RTM_NEWLINKRTM_DELLINK条消息
  6. 您将收到初始接口列表及其未来的更改

答案 2 :(得分:4)

请记住,在Linux上“一切”都是一个文件。

最好的方法是使用已安装在sysfs的已批准的内核< - >用户空间通信,即/sys。网络设备在/sys/class/net

链接

如果您想使用ioctl界面,请查看man netdevice

答案 3 :(得分:1)

您想如何识别网卡?您可以尝试查看/etc/udev/rules.d/70-persistent-net.rules,它将硬件MAC地址映射为漂亮的名称(例如eth0)。

然后,当您拥有更好的名称时,您可以运行ethtool eth0之类的内容来确定它是否[物理上]连接(最后一行),ifconfig eth0以确定它是否已启动(查找“UP BROADCAST ...”),如果它有IP地址。

我愿意猜测这有自动库吗?你环顾四周吗?我不确定NetworkManager中是否有易于访问的代码,但这应该是一个很好的首选。

答案 4 :(得分:1)

运行getifaddrs的输出,您可以使用MAC地址的链接层来标识适配器,并检查ifa_flags的IFF_UP。使用AF_NETLINK获取有关界面更改的通知。