【问题标题】:On Linux: how can I programmatically determine if a NIC interface is enabled and plugged in?在 Linux 上:如何以编程方式确定是否启用并插入了 NIC 接口?
【发布时间】:2010-07-09 20:50:35
【问题描述】:

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

【问题讨论】:

标签: linux network-programming


【解决方案1】:

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

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

虽然我猜想执行ifconfig 和朋友会给你更多的*BSD 兼容性。

【讨论】:

  • 对于旧内核是否有同样优雅的东西?在我的旧 CentOS 4 机器上,内核为 2.6.9,我在 /sys/class/net/eth? 下没有“操作状态”文件。
  • 你知道如何查看链接状态吗?有那个文件吗?当你做ethtool eth0 时,输出将显示你检测到链接:YES
  • @EFraim 我刚刚验证这在我的 2.6.31 上无法正常工作。似乎对于接入点来说,直到有人没有连接它才会启动,而 ifconfig 显示它已经启动。这是一个很大的区别。不过,我现在不能用新内核轻松检查这一点。换句话说,flag 出现,carrier 0,operstate down。
【解决方案2】:
  1. 打开AF_NETLINK套接字
  2. 将其绑定到sockaddr_nlnl_groups = RTMGRP_LINK
  3. 向内核发送消息RTM_GETLINK
  4. 在套接字上进行 poll/epoll 以读取 RTM_NEWLINKRTM_DELLINK 消息
  5. 您将在未来收到初始接口列表及其更改

【讨论】:

    【解决方案3】:

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

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

    如果您想使用ioctl 接口,请查看man netdevice

    【讨论】:

      【解决方案4】:

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

      然后,当你有更好的名字时,你可以运行类似ethtool eth0 来确定它是否[物理] 连接(最后一行),ifconfig eth0 来确定它是否已启动(查找“UP BROADCAST. .."),以及是否有 IP 地址。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2013-08-12
          • 1970-01-01
          • 2011-09-23
          • 1970-01-01
          • 2019-12-01
          • 2011-03-07
          • 1970-01-01
          • 1970-01-01
          • 2011-06-18
          相关资源
          最近更新 更多