【填坑2】获取设备所有网卡的mac地址

生产上的bug:

由于用户删除网卡之后未作重启动作,导致网卡不连续,ip a查看网卡信息前面的序号不连续。

比如:正常是123456,删除4之后成了123 56 。

获取机器所有网卡的mac地址,5 6号网卡信息未读到。

代码1:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/if_ether.h>
#include <net/if.h>

int getMacInfo()
{
struct ifreq ifr;

int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
return -1;
}

int index = 1;
while(1) {

ifr.ifr_ifindex = index++;
if (ioctl(sock, SIOCGIFNAME, &ifr) != 0) {
close(sock);
return 0;
}

if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback
if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {

printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
(unsigned char)ifr.ifr_hwaddr.sa_data[0],
(unsigned char)ifr.ifr_hwaddr.sa_data[1],
(unsigned char)ifr.ifr_hwaddr.sa_data[2],
(unsigned char)ifr.ifr_hwaddr.sa_data[3],
(unsigned char)ifr.ifr_hwaddr.sa_data[4],
(unsigned char)ifr.ifr_hwaddr.sa_data[5]);
}
}
}
}

close(sock);
return -1;
}

int main(int argc, char **argv)
{
getMacInfo();
return 0;
}

 

又改了一版,强制循环读20次

代码2:

int getMacInfo()
{
struct ifreq ifr;

int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
return -1;
}

int index = 1;
while(index<21) {

ifr.ifr_ifindex = index++;

if (ioctl(sock, SIOCGIFNAME, &ifr) != 0) {
continue;
}

if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback
if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {

printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
(unsigned char)ifr.ifr_hwaddr.sa_data[0],
(unsigned char)ifr.ifr_hwaddr.sa_data[1],
(unsigned char)ifr.ifr_hwaddr.sa_data[2],
(unsigned char)ifr.ifr_hwaddr.sa_data[3],
(unsigned char)ifr.ifr_hwaddr.sa_data[4],
(unsigned char)ifr.ifr_hwaddr.sa_data[5]);
}
}
}
}

close(sock);
return -1;
}

int main(int argc, char **argv)
{
getMacInfo();
return 0;
}

 

这样做不是很完美,后来又出了一版,用ioctl的SIOCGIFCONF参数

代码3:

#include <net/if.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{

int i = 0;
int sockfd;
struct ifconf ifconf;
char buf[1024];
struct ifreq *ifreq;

ifconf.ifc_len = sizeof(buf);
ifconf.ifc_buf = (caddr_t)buf;

if ((sockfd=socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
exit(1);
}

ioctl(sockfd, SIOCGIFCONF, &ifconf);

ifreq = (struct ifreq*)buf;
printf("ifconf.ifc_len: %d sizeof(struct ifreq):%d\n", (int)ifconf.ifc_len, (int)sizeof(struct ifreq));
for (i=(ifconf.ifc_len/sizeof(struct ifreq))-1; i>=0; i--) {

if (ioctl(sockfd, SIOCGIFHWADDR, &ifreq[i]) == 0) {
printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
(unsigned char)ifreq[i].ifr_hwaddr.sa_data[0],
(unsigned char)ifreq[i].ifr_hwaddr.sa_data[1],
(unsigned char)ifreq[i].ifr_hwaddr.sa_data[2],
(unsigned char)ifreq[i].ifr_hwaddr.sa_data[3],
(unsigned char)ifreq[i].ifr_hwaddr.sa_data[4],
(unsigned char)ifreq[i].ifr_hwaddr.sa_data[5]);
}

}
close(sockfd);
return 0;
}

这一版获取的mac信息也不全。

网上找的原因:系统接口,通过ioctl  SIOCGIFCONF来获取网卡信息有个问题,就是当我的网卡没能分配到ip时,就会获取不到该网卡信息

 

最后定了一版,就是先从系统文件/proc/net/dev中读出所有的devName,再调用ioctl接口获取mac信息。这下应该没啥问题了。

代码稍后。

 

由于粘的代码,缩进丢失,博客园不会添加代码块,还有本人比较懒。先凑合看看吧。

后期一定优化,下班了。

原文地址:https://www.cnblogs.com/pangkr-linux/p/10420015.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


现在给大家介绍一下如何查询MAC的生产日期,希望对你查询MAC的生产日期操作有所帮助。
1、点击【编辑虚拟机设置】,转到【CD/DVD (SATA)】,选中【使用 ISO 映像文件】复选框,点击【浏览】,找到已经准备好的 MacOS Ventura 镜像;4、客户机操作系统下,选择【Apple Mac OS X】,版本选择大家需要的【macOS版本】,再点击【下一步】;7、完成【抹掉】后,左上角关闭该窗口,返回上一界面,选择【Install macOS】,正式进入苹果系统安装流程;1、打开 Vmware Workstation,然后点击左上角的【文件】,打开的下拉项中,选择【新建虚拟机】;
注意:用哪个版本的 Python 运行安装脚本,pip 就被关联到哪个版本。一般情况 pip 对应的是 Python 2.7,pip3 对应的是 Python 3.x。pip介绍:pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。1.打开后输入python3确定电脑上是否已安装python3,如果输入python是查看mac上的自带版本。如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具。如下图是已经成功安装pip的状态。
Mac 安装nvm
Mac(M1)安装VMware虚拟机及Linux系统
Mac 如何安装 Telnet,mac安装telnet命令
是不是对键盘输入厌烦了?那你可以试试语音输入。 你可以按照下面的步骤打开Mac的语音输入功能。 以 macOS Catalina 为例: Step 1. 点击屏幕左上角的图标,点击【系统偏好设置】。
1.clean my Mac&#160;x 2.Cleaner One Pro 3.App Cleaner
按caps lock键。 CapsLock键,短按切换中英文,长按切换大小写。
windows: 1.PowerToys 2.不用软件进行分屏 Windows 10技巧1:窗口1/4分屏 - Acer Community 介绍说明 从Win7时代开始,微软便引入了屏幕热区概念,即
https://zhuanlan.zhihu.com/p/111111684 下载地址: https://www.smoothscroll.net/mac/
https://support.apple.com/zh-cn/guide/imac/apd2e7352054/mac 浏览:24 英寸&#160;iMac 24 英寸&#160;iMac 比以往更个
在Mac自带的中文输入法中,“反斜杠”键(“\”)就是顿号。
1.系统偏好设置。 2和3步如下图: 注意:在设置后,启用capslock大写的时候,需要长按capslock键。
Typora是一款轻便简洁的Markdown编辑器,支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别。即时渲染使得你写Markdown就想是写Word文档一样流畅自如,不像其他编辑器的有编辑栏和显示栏。简洁美观实时预览扩展语法跨平台免费Typora现在收费,但你仍然可以在官方网站上找到历史版本。虽然新版本仍然值得收费,但免费版本仍然可以使用。httpshttpshttpshttpshttpshttpshttpshttps。......
Mac M1安装Centos7
连接为官方下载链接, 直接复制MD5可迅雷下载亲测可用, 和付费版使用体验无差别.1. Windows 64bithttps://download.typora.io/windows/typora-setup-x64-0.11.18.exeMD5:12F96372BEE2951ACF5627EA28F8A389**2. Window 32bit **https://download.typora.io/windows/typora-setup-ia32-0.11.18.exeMD5:F5036
ubuntu22.04 、系统安装、win双系统、Ubuntu分区、Ubuntu优化、美化gnome tweaks,扩展、macos、搜狗输入法、wps字体、微信安装、navicat15、java开发环境搭建、idea 输入法问题处理、双系统问题、github慢等等。史上最全保姆级Ubuntu使用教程
MAC怎么获取文件路径 MAC获取文件路径的四种方法