服务器测评网
我们一直在努力

Linux C 获取 MAC 地址,代码怎么写?

在Linux环境下使用C语言获取MAC地址,通常涉及网络接口的操作,MAC地址(Media Access Control Address)是网络设备的硬件标识符,一般由6个字节组成,以十六进制表示,以下将详细介绍实现方法,包括相关API、代码示例及注意事项。

核心原理与API

获取MAC地址主要通过读取网络接口的信息实现,Linux提供了多种系统调用和库函数,其中最常用的是ioctl配合SIOCGIFHWADDR命令,或通过netlink套接字读取路由信息,读取/sys/class/net/[interface]/address文件也是一种简单直接的方法,适合脚本或简单程序。

方法 优点 缺点
ioctl 传统方法,兼容性好 需要手动处理接口名,代码较复杂
netlink 功能强大,可获取更多网络信息 API复杂,学习成本高
读取文件 简单直观 依赖文件系统,非标准API

使用ioctl获取MAC地址

ioctl是Linux中用于设备控制的系统调用,结合网络接口请求命令SIOCGIFHWADDR,可直接读取指定接口的MAC地址,以下是实现步骤:

  1. 创建套接字:使用socket(AF_INET, SOCK_DGRAM, 0)创建数据报套接字。
  2. 初始化接口请求结构体:定义struct ifreq,设置接口名(如”eth0″)。
  3. 调用ioctl:传入SIOCGIFHWADDR命令获取硬件地址。
  4. 解析结果:从ifreq结构体的ifr_hwaddr字段提取MAC地址。

示例代码片段:

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <sys/ioctl.h>
void get_mac(const char *interface) {
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    struct ifreq ifr;
    strcpy(ifr.ifr_name, interface);
    if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
        unsigned char *mac = (unsigned char *)ifr.ifr_hwaddr.sa_data;
        printf("MAC Address: %02x:%02x:%02x:%02x:%02x:%02x\n", 
               mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
    }
    close(sock);
}

错误处理与注意事项

  1. 权限问题:程序需要足够权限(通常为root用户)才能执行ioctl操作。
  2. 接口有效性:需检查接口是否存在(如通过if_nametoindex)。
  3. 多接口处理:系统可能有多个网络接口(如eth0、wlan0),需明确目标接口或遍历所有接口。
  4. 字节序与格式:MAC地址通常以十六进制字符串表示,注意字节顺序(小端序)。

扩展方法:读取/proc或/sys文件

Linux内核将网络接口信息暴露在/sys/class/net/[interface]/address文件中,直接读取该文件可快速获取MAC地址。

FILE *fp = fopen("/sys/class/net/eth0/address", "r");
if (fp) {
    char mac[18];
    fgets(mac, sizeof(mac), fp);
    printf("MAC Address: %s", mac);
    fclose(fp);
}

此方法无需特殊权限(普通用户可读),但依赖文件系统结构,不适合嵌入式系统或无文件系统的环境。

在Linux C编程中,ioctl是获取MAC地址的标准方法,兼容性强且灵活;读取文件则适合简单场景,实际开发中需结合需求选择,并注意错误处理和跨平台兼容性,对于复杂网络管理,可进一步探索netlinklibnl库。

赞(0)
未经允许不得转载:好主机测评网 » Linux C 获取 MAC 地址,代码怎么写?