gpt4 book ai didi

C/C++ Linux 所有接口(interface)的MAC地址

转载 作者:IT王子 更新时间:2023-10-29 00:25:56 49 4
gpt4 key购买 nike

我正在使用以下代码检索当前计算机的所有 MAC 地址:

ifreq ifr;
ifconf ifc;
char buf[1024];

int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
if (sock == -1) { ... };

ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { ... }

ifreq *it = ifc.ifc_req;
const ifreq* const end = it + (ifc.ifc_len / sizeof(ifreq));

for (; it != end; ++it) {
strcpy(ifr.ifr_name, it->ifr_name);
if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
if (!(ifr.ifr_flags & IFF_LOOPBACK)) {
if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
unsigned char mac_address[6];
memcpy(mac_address, ifr.ifr_hwaddr.sa_data, 6);
...
}
}
}
else { ... }
}

通过运行简单的 shell 命令 ifconfig,我可以看到 lo、eth0 和 wlan0。我想通过我的 C/C++ 代码检索 eth0 和 wlan0 的 MAC 地址。但只返回 wlan0 - eth0 丢失(我得到 ifr_names lo, lo, wlan0)。可能是因为 eth0 未激活(未连接以太网电缆,电缆返回)。我能否以某种方式更改 ioctl(SIOCGIFCONF) 命令以检索 eth0,即使它已“关闭”?

我可以直接使用它的HW地址

  struct ifreq s;
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);

strcpy(s.ifr_name, "eth0");
if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) { ... }

但是如果名称不是 eth0 而是其他名称(eth1、em0、...)怎么办?我想得到所有这些。感谢您的帮助。

最佳答案

您应该停止使用 net-tools 和陈旧的 ioctl 接口(interface),并开始使用现代的 Netlink/sysfs 接口(interface)。你有不少于 5 种可能性:

  • 编写您自己的 Netlink 接口(interface)代码
  • 您自己的 NL 代码,结合使用 libmnl(-> 请参阅 Examples 中的 rtnl-link-dump|
  • 或利用 libnl3 等自主库
  • 解析 ip -o link 的文本输出(-o 是获取用于文本解析的输出,与 ifconfig 不同)
  • 或使用 sysfs 并查看 /sys/class/net/eth0/address

关于C/C++ Linux 所有接口(interface)的MAC地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9034575/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com