zoukankan      html  css  js  c++  java
  • Get MAC address using POSIX APIs

    #include <stdio.h>
    #include <unistd.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <sys/ioctl.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <net/if.h>

    #define MAXINTERFACES 16

    void get_ip()
    {
        int sock_fd;
        struct ifreq buf[MAXINTERFACES];
        struct ifconf ifc;
        int interface_num;
        char *addr;//[ADDR_LEN];

        if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
        {
            printf("Create socket failed");
            return;
        }
        ifc.ifc_len = sizeof(buf);
        ifc.ifc_req = buf;
        if(ioctl(sock_fd, SIOCGIFCONF, (char *)&ifc) < 0)
        {
            printf("Get a list of interface addresses failed");
            return;
        }
        
        interface_num = ifc.ifc_len / sizeof(struct ifreq);
        printf("The number of interfaces is %d ", interface_num);

        while(interface_num--) 
        {
            printf("Net device: %s ", buf[interface_num].ifr_name);

            if(ioctl(sock_fd, SIOCGIFFLAGS, (char *)&buf[interface_num]) < 0)
            {
                printf("Get the active flag word of the device");
                continue;
            }
            if(buf[interface_num].ifr_flags & IFF_PROMISC)
                printf("Interface is in promiscuous mode ");

            if(buf[interface_num].ifr_flags & IFF_UP)
                printf("Interface is running ");
            else
                printf("Interface is not running ");

            if(ioctl(sock_fd, SIOCGIFADDR, (char *)&buf[interface_num]) < 0)
            {
                printf("Get interface address failed");
                continue;
            }
            addr = inet_ntoa(((struct sockaddr_in*)(&buf[interface_num].ifr_addr))->sin_addr);
            printf("IP address is %s ", addr);  
        }

    close(sock_fd);
        return;
    }

    void get_mac()
    {
        int sock_fd;
        struct ifreq buf[MAXINTERFACES];
        struct ifconf ifc;
        int interface_num;
        
        if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
        {
            printf("Create socket failed");
            return;
        }
        ifc.ifc_len = sizeof(buf);
        ifc.ifc_req = buf;
        if(ioctl(sock_fd, SIOCGIFCONF, (char *)&ifc) < 0)
        {
            printf("Get a list of interface addresses failed");
            return;
        }
        interface_num = ifc.ifc_len / sizeof(struct ifreq);
        printf("The number of interfaces is %d ", interface_num);

        while(interface_num--) 
        {
            printf("Net device: %s ", buf[interface_num].ifr_name);

            if(ioctl(sock_fd, SIOCGIFFLAGS, (char *)&buf[interface_num]) < 0)
            {
                printf("Get the active flag word of the device");
                continue;
            }
            if(buf[interface_num].ifr_flags & IFF_PROMISC)
                printf("Interface is in promiscuous mode ");

            if(buf[interface_num].ifr_flags & IFF_UP)
                printf("Interface is running ");
            else
                printf("Interface is not running ");

            if(ioctl(sock_fd, SIOCGIFHWADDR, (char *)&buf[interface_num]) < 0)
            {
                printf("Get the hardware address of a device failed");
                continue;
            }

            printf("Mac address is: %02X:%02X:%02X:%02X:%02X:%02X ",
                (unsigned char)buf[interface_num].ifr_hwaddr.sa_data[0],
                (unsigned char)buf[interface_num].ifr_hwaddr.sa_data[1],
                (unsigned char)buf[interface_num].ifr_hwaddr.sa_data[2],
                (unsigned char)buf[interface_num].ifr_hwaddr.sa_data[3],
                (unsigned char)buf[interface_num].ifr_hwaddr.sa_data[4],
                (unsigned char)buf[interface_num].ifr_hwaddr.sa_data[5]);
        }

       close(sock_fd);
    }

  • 相关阅读:
    python基础008----Python中类/函数/模块的简单介绍
    linux基础004---用户管理、用户登录注销、系统关机重启
    python基础006----流程控制&推导式&深浅拷贝
    python基础005----字典&集合
    python基础004----列表&元组
    难缠的布隆过滤器,这次终于通透了
    C# 位图BitArray 小试牛刀
    以步步为营的风格解读 Redis分布式锁
    你是不是对MD5算法有误解?
    最适合新手的Redis Cluster搭建过程
  • 原文地址:https://www.cnblogs.com/len3d/p/4225417.html
Copyright © 2011-2022 走看看