ZBLOG

linux c如何获取到mac地址

在Linux下,可以使用C语言通过多种方式获取MAC地址。最常用的方法是通过网络接口的系统文件或使用相关的socket API。以下是两种常见方法来获取MAC地址。

方法 1: 使用getifaddrs

这个方法利用了getifaddrs函数,它可以获得本地所有网络接口的信息,包括MAC地址。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ifaddrs.h>
#include <net/ethernet.h> // For ethernet_addr
#include <arpa/inet.h>

void print_mac_address(unsigned char *mac) {
    printf("MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n",
           mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}

int main() {
    struct ifaddrs *ifaddr, *ifa;
    
    if (getifaddrs(&ifaddr) == -1) {
        perror("getifaddrs");
        return EXIT_FAILURE;
    }

    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
        if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_PACKET) { // Check for Ethernet
            unsigned char *mac = (unsigned char *)LLADDR((struct sockaddr_dl *)ifa->ifa_addr);
            print_mac_address(mac);
        }
    }

    freeifaddrs(ifaddr);
    return EXIT_SUCCESS;
}

方法 2: 使用Socket编程和ioctl

这个方法使用了socket编程,结合ioctl调用来获取特定网络接口的MAC地址。

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

void get_mac_address(const char *interface) {
    int fd;
    struct ifreq iface;

    fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (fd == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    strncpy(iface.ifr_name, interface, IFNAMSIZ - 1);

    // 获取 MAC 地址
    if (ioctl(fd, SIOCGIFHWADDR, &iface) == -1) {
        perror("ioctl");
        close(fd);
        exit(EXIT_FAILURE);
    }

    unsigned char *mac = (unsigned char *)iface.ifr_hwaddr.sa_data;
    
    printf("MAC address of %s: %02x:%02x:%02x:%02x:%02x:%02x\n", 
           interface,
           mac[0], mac[1], mac[2],
           mac[3], mac[4], mac[5]);

   close(fd);
}

int main() {
   get_mac_address("eth0"); // 将 "eth0" 替换为你想要查询的网卡名称
   return 0;
}

编译和运行

将上面的代码保存到一个C源文件中,例如 get_mac.c,然后使用gcc编译:

gcc get_mac.c -o get_mac

然后运行程序:

./get_mac

注意:

  • 在第二个示例中,你需要根据你的实际网络接口名替换 "eth0"(例如可能是 "enp0s3" 或其他名称)。
  • 上述代码需要适当的权限,有时需要以root用户身份运行。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=7931

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?