linux下用代码获取系统的IP与MAC

来源:互联网 发布:ug编程没刀库的刀具号 编辑:程序博客网 时间:2024/06/05 08:53
#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#define MAC_ADDR_LEN 18#define ADDR_LEN 16void err_quit(char *msg){    perror(msg);    exit(1);}char *getIP(char *addr){    int sock_fd;    struct ifreq buf[MAXINTERFACES];    struct ifconf ifc;    int interface_num;    if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)        err_quit("Create socket failed");    ifc.ifc_len = sizeof(buf);    ifc.ifc_req = buf;    if(ioctl(sock_fd, SIOCGIFCONF, (char *)&ifc) < 0)        err_quit("Get a list of interface addresses failed");    interface_num = ifc.ifc_len / sizeof(struct ifreq);    printf("The number of interfaces is %d\n", interface_num);    while(interface_num--) {        // printf("Net device: %s\n", buf[interface_num].ifr_name);        if(ioctl(sock_fd, SIOCGIFFLAGS, (char *)&buf[interface_num]) < 0)            err_quit("Get the active flag word of the device");        if(buf[interface_num].ifr_flags & IFF_PROMISC)            printf("Interface is in promiscuous mode\n");        if(ioctl(sock_fd, SIOCGIFADDR, (char *)&buf[interface_num]) < 0)            err_quit("Get interface address failed");        addr = inet_ntoa(((struct sockaddr_in*)(&buf[interface_num].ifr_addr))->sin_addr);        printf("%s的IP address is %s\n",buf[interface_num].ifr_name, addr);       }  return addr;}char *getMAC(char *mac_addr){    int sock_fd;    struct ifreq buf[MAXINTERFACES];    struct ifconf ifc;    int interface_num;    if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)        err_quit("Create socket failed");    ifc.ifc_len = sizeof(buf);    ifc.ifc_req = buf;    if(ioctl(sock_fd, SIOCGIFCONF, (char *)&ifc) < 0)        err_quit("Get a list of interface addresses failed");    interface_num = ifc.ifc_len / sizeof(struct ifreq);    printf("The number of interfaces is %d\n", interface_num);    while(interface_num--) {        // printf("Net device: %s\n", buf[interface_num].ifr_name);        if(ioctl(sock_fd, SIOCGIFFLAGS, (char *)&buf[interface_num]) < 0)            err_quit("Get the active flag word of the device");        if(buf[interface_num].ifr_flags & IFF_PROMISC)            printf("Interface is in promiscuous mode\n");        if(ioctl(sock_fd, SIOCGIFHWADDR, (char *)&buf[interface_num]) < 0)            err_quit("Get the hardware address of a device failed");        snprintf(mac_addr, MAC_ADDR_LEN, "%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]);         printf("%s的Mac address is %s\n",buf[interface_num].ifr_name, mac_addr);    }    return mac_addr; }int main(int argc, char *argv[]){    char addr[ADDR_LEN];    char mac_addr[MAC_ADDR_LEN];    printf("\n****************************************\n");    getIP(addr);    printf("\n****************************************\n");    getMAC(mac_addr);    printf("\n****************************************\n");    return 0;}

0 0
原创粉丝点击