• Linux系统下用C语言获取MAC地址


    Linux系统下用C语言获取MAC地址

    最近在做一个小程序,需要用到在linux系统里编写C程序从而获取MAC地址,从网上搜了一遍,想总结一下。如果你就只需要单个功能的程序,可以采用方法一,见代码1,一般最好能够封装起来,写成获取MAC地址的函数再调用,可以采用方法二,见代码2。

    代码1:

    复制代码
    #include <stdio.h>
    #include <sys/ioctl.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <net/if.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
    
            struct ifreq ifreq;
            int sock;
    
            if(argc!=2)
            {
                    printf("Usage : ethname
    ");
                    return 1;
            }
            if((sock=socket(AF_INET,SOCK_STREAM,0))<0)
            {
                    perror("socket");
                    return 2;
            }
            strcpy(ifreq.ifr_name,argv[1]);
            if(ioctl(sock,SIOCGIFHWADDR,&ifreq)<0)
            {
                    perror("ioctl");
                    return 3;
            }
            printf("%02x:%02x:%02x:%02x:%02x:%02x
    ",
                            (unsigned char)ifreq.ifr_hwaddr.sa_data[0],
                            (unsigned char)ifreq.ifr_hwaddr.sa_data[1],
                            (unsigned char)ifreq.ifr_hwaddr.sa_data[2],
                            (unsigned char)ifreq.ifr_hwaddr.sa_data[3],
                            (unsigned char)ifreq.ifr_hwaddr.sa_data[4],
                            (unsigned char)ifreq.ifr_hwaddr.sa_data[5]);
            return 0;
    }
    复制代码

    将代码写入一个C文件,名称随便取,姑且存为MAC_addr.c。

    在linux下运行:gcc -o  MAC_addr MAC_addr.c

    下一条指令要十分注意,这个函数是带参数才能执行的,可以用以下指令:

    ./MAC_addr  etho 即可获得MAC地址。

    想用封装的形式,写成一个求MAC地址的函数,然后再调用此函数,可以用方法二,见代码2。

    代码2:

    复制代码
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/ioctl.h>
    #include <net/if.h>        //for struct ifreq
    
    int get_mac(char * mac, int len_limit)    //返回值是实际写入char * mac的字符个数(不包括'')
    {
        struct ifreq ifreq;
        int sock;
    
        if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0)
        {
            perror ("socket");
            return -1;
        }
        strcpy (ifreq.ifr_name, "eth0");    //Currently, only get eth0
    
        if (ioctl (sock, SIOCGIFHWADDR, &ifreq) < 0)
        {
            perror ("ioctl");
            return -1;
        }
        
        return snprintf (mac, len_limit, "%X:%X:%X:%X:%X:%X", (unsigned char) ifreq.ifr_hwaddr.sa_data[0], (unsigned char) ifreq.ifr_hwaddr.sa_data[1], (unsigned char) ifreq.ifr_hwaddr.sa_data[2], (unsigned char) ifreq.ifr_hwaddr.sa_data[3], (unsigned char) ifreq.ifr_hwaddr.sa_data[4], (unsigned char) ifreq.ifr_hwaddr.sa_data[5]);
    }
    
    int main()
    {
        char    szMac[18];
        int        nRtn = get_mac(szMac, sizeof(szMac));
        if(nRtn > 0)
        {
            fprintf(stderr, "MAC ADDR: %s
    ", szMac);
        }
        return 0;
    }
    复制代码

    将代码写入一个C文件,姑且存为MAC_addr.c。

    在linux下运行:gcc -o  MAC_addr MAC_addr.c

    ./MAC_addr  即可获得MAC地址。

    亲测以上方法都是通过的,欢迎讨论是否还有更好的方法!

     
     
     
  • 相关阅读:
    量子纠错码——Stabilizer codes
    量子计算机编程(三)——量子应用
    量子计算机编程(二)——QPU基础函数
    量子计算机编程(一)——QPU编程
    量子搜索算法 Grover search
    因数分解算法、周期查找算法(简化)
    量子傅里叶变换
    简单的量子算法(二):Simon's Algorithm
    简单的量子算法(一):Hadamard 变换、Parity Problem
    Web Scraper——轻量数据爬取利器
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3299986.html
Copyright © 2020-2023  润新知