C++获取网卡的MAC地址

一 代码

#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/if_ether.h>
#include <bits/ioctls.h>
#include <linux/if_packet.h>
#include <net/ethernet.h>
#include <errno.h>
#include <string.h> //bzero
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h> //for close
#include <arpa/inet.h>//htons
#include <stdio.h>
#include <stdlib.h>//EXIT_FAILURE

#define IFRNAME   "eno16777736"

unsigned char dest_mac[6] = { 0 };

int main(int argc, char **argv)
{
    int i, datalen;
    int sd;

    struct sockaddr_ll device;
    struct ifreq ifr;  //定义网口的信息请求体

    bzero(&ifr, sizeof(struct ifreq));

    if ((sd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL))) < 0)   // 创建原始套接字
    {
        printf("socket() Failed to get socket descriptor for using ioctl()");
        return (EXIT_FAILURE);
    }
    memcpy(ifr.ifr_name, IFRNAME, sizeof(struct ifreq));
    if (ioctl(sd, SIocgIFHWADDR, &ifr) < 0) {                     //发送请求
        printf("ioctl() Failed to get source MAC address");
        return (EXIT_FAILURE);
    }
    close(sd);

    memcpy(dest_mac, ifr.ifr_hwaddr.sa_data, 6);
    // 打印MAC地址
    printf("mac addr:%02x:%02x:%02x:%02x:%02x:%02x\n", dest_mac[0], dest_mac[1], dest_mac[2], dest_mac[3], dest_mac[4], dest_mac[5]);

    return 0;
}

二 运行

[root@localhost test]# g++ test.cpp -o test
[root@localhost test]# ./test
mac addr:08:00:27:60:7b:7f

三 说明

首先创建一个链路层的原始套接字,然后把网卡名字复制给ifr.ifr_name,接着调用ioctl函数获取SIocgIFHWADDR指定的信息,即网卡的MAC地址。因为这里创建的套接字是链路层套接字,所以通过SIocgIFHWADDR获得的地址是MAC地址。

相关文章

方法: 打开一个新的可跨域的chrome窗口实现方法: 1. 打开终...
MacBook Pro 14价格和配置对比 尺寸 SOC&#x9;内存&#...
现在给大家介绍一下如何查询MAC的生产日期,希望对你查询MAC...
1、点击【编辑虚拟机设置】,转到【CD/DVD (SATA)】,选中【...
注意:用哪个版本的 Python 运行安装脚本,pip 就被关联到哪...
Mac 安装nvm