c - C程序如何在不轮询内核的情况下获取新添加的NIC的pci地址?

标签 c sockets netlink

根据下面的链接,我了解到通过创建 netlink 套接字并监听 RTMGRP_LINK 我们可以检测事件(网络接口(interface)创建/删除/上/下事件)。

How can I monitor the NIC status(up/down) in a C program without polling the kernel?

是否可以在检测到新添加的接口(interface)后获取其pci地址?

最佳答案

一旦您知道它的接口(interface)名称(例如 eth0),您就可以使用 ethtool API 查询该信息:

#include <linux/ethtool.h> 
#include <linux/sockios.h>
.. and other socket headers.
...

 int sock = socket(PF_INET, SOCK_DGRAM, 0);

 struct ifreq ifr;
 struct ethtool_cmd cmd;
 struct ethtool_drvinfo drvinfo;

 memset(&ifr, 0, sizeof ifr);
 memset(&cmd, 0, sizeof cmd);
 memset(&drvinfo, 0, sizeof drvinfo);
 strcpy(ifr.ifr_name, "eno1");

 ifr.ifr_data = &drvinfo;
 drvinfo.cmd = ETHTOOL_GDRVINFO;

 if(ioctl(sock, SIOCETHTOOL, &ifr) < 0) {
    perror("ioctl")
    return;
 }

现在 PCI 总线地址在 drvinfo.bus_info 中以字符串形式提供 - 假设 NIC 实际上是一个 PCI 设备。

您也可以通过命令行检查:

$ ethtool -i eno1
driver: e1000e
version: 2.3.2-k
firmware-version: 0.13-4
bus-info: 0000:00:19.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no

关于c - C程序如何在不轮询内核的情况下获取新添加的NIC的pci地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29567287/

相关文章:

c - 在 ARM64 中使用 ARM Neon Intrinsic 对 64 位 double 值进行算术运算

c - 绑定(bind)到一个 veth 接口(interface)

javascript - Sails.js:特定于 socket.io 的策略

linux - netlink 和大端格式

c - foo(int arr[]) 和 foo(int arr[10]) 有什么区别?

c - C语言中的欧拉恒等式

java - 用于 Linux 的简单套接字服务器

linux - 计算连接系统调用的时间

c - 通过 NetLink 发送的数据大小

c++ - 如何获取所有物理接口(interface)