Linux C语言获取设备MAC地址

本文介绍了一种在Linux环境下通过C语言程序获取指定网卡(如eth0)MAC地址的方法。利用socket编程技术和ioctl系统调用,实现了从系统内核读取硬件地址的功能。

在Linux平台下编译运行如下代码即可获取到设备的MAC地址:

eg:编译命令  gcc -o example example.c

     执行命令  ./example

#include <stdio.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/if_ether.h>
#include <net/if.h>
#include <linux/sockios.h>
void main()
{
char *device="eth0"; //teh0是网卡设备名
unsigned char macaddr[ETH_ALEN]; //ETH_ALEN(6)是MAC地址长度
//AF_INET = 1;
int i,s;
s = socket(AF_INET,SOCK_DGRAM,0); //建立套接口
struct ifreq req;
int err,rc;
rc = strcpy(req.ifr_name,device); //将设备名作为输入参数传入
err=ioctl(s,SIOCGIFHWADDR,&req); //执行取MAC地址操作
close(s);
if( err != -1 )
{
 memcpy(macaddr,req.ifr_hwaddr.sa_data,ETH_ALEN); //取输出的MAC地址
   for(i=0;i<ETH_ALEN;i++)
   printf("%2x:",macaddr[i]);
}
printf("\r\n");
}


Linux系统中,你可以使用C语言通过读取sysfs目录来获取网卡(如eth0)的MAC地址。sysfs是一个动态的文件系统,它提供了一种标准的方式来访问内核对象的信息。下面是一个简单的示例,展示如何使用C语言实现这个功能: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <fcntl.h> #include <unistd.h> #include <linux/if_ether.h> // 包含mac地址结构体定义 #define ETH_DEV "/sys/class/net/eth0" // 假设你要获取的是eth0 struct ether_addr mac_addr; // 存储mac地址的结构体 void get_mac_address(const char *dev_path) { FILE *fp; char buf[ETH_ADDR_LEN]; // ETH_ADDR_LEN通常等于6,因为MAC地址是6字节 if ((fp = fopen(dev_path "/address", "r")) != NULL) { if (fgets(buf, sizeof(buf), fp)) { int i; for (i = 0; i < ETH_ADDR_LEN; i++) { mac_addr.ba[i] = buf[i]; if (buf[i] == ':') { mac_addr.ba[i] = '\0'; // 将冒号替换为NULL终止符 } } mac_addr.ba[ETH_ADDR_LEN] = '\0'; // 添加终止符 fclose(fp); } else { perror("Failed to read MAC address"); } } else { perror("Failed to open file"); } } int main() { get_mac_address(ETH_DEV); printf("MAC Address of eth0: %02X:%02X:%02X:%02X:%02X:%02X\n", mac_addr.ba[0], mac_addr.ba[1], mac_addr.ba[2], mac_addr.ba[3], mac_addr.ba[4], mac_addr.ba[5]); return 0; } ``` 在这个例子中,程序打开`/sys/class/net/eth0/address`文件并读取其中的内容,内容通常是十六进制的MAC地址,中间用冒号分隔。然后将每个部分转换为对应的二进制值,并存储到`mac_addr`结构体中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值