mac.c

来自「MAC源码」· C语言 代码 · 共 107 行

C
107
字号
#include <stdio.h>#include <sys/types.h>#include <sys/param.h>#include <sys/ioctl.h>#include <sys/socket.h>#include <net/if.h>#include <netinet/in.h>#include <net/if_arp.h>#define MAXINTERFACES 16int main(argc, argv)register int argc;register char *argv[];{    register int fd, intrface, retn = 0;    struct ifreq buf[MAXINTERFACES];    struct arpreq arp;    struct ifconf ifc;    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {      ifc.ifc_len = sizeof buf;      ifc.ifc_buf = (caddr_t) buf;      if (!ioctl(fd, SIOCGIFCONF, (char *) &ifc)) {          intrface = ifc.ifc_len / sizeof(struct ifreq);          printf("interface num is intrface=%d\n\n\n", intrface);          while (intrface-- > 0) {            printf("net device %s\n", buf[intrface].ifr_name);/*Jugde whether the net card status is promisc*/            if (!(ioctl(fd, SIOCGIFFLAGS, (char *) &buf[intrface]))) {                if (buf[intrface].ifr_flags & IFF_PROMISC) {                  puts("the interface is PROMISC");                  retn++;                }            } else {                char str[256];                sprintf(str, "cpm: ioctl device %s",                      buf[intrface].ifr_name);                perror(str);            }/*Jugde whether the net card status is up*/            if (buf[intrface].ifr_flags & IFF_RUNNING) {                puts("the interface status is UP");            } else {                puts("the interface status is DOWN");            }/*Get IP of the net card */            if (!(ioctl(fd, SIOCGIFADDR, (char *) &buf[intrface]))) {                puts("IP address is:");                puts(inet_ntoa                   (((struct sockaddr_in *) (&buf[intrface].                                       ifr_addr))->sin_addr));                puts("");//puts (buf[intrface].ifr_addr.sa_data);            } else {                char str[256];                sprintf(str, "cpm: ioctl device %s",                      buf[intrface].ifr_name);                perror(str);            }/*Get HW ADDRESS of the net card */            if (!(ioctl(fd, SIOCGIFHWADDR, (char *) &buf[intrface]))) {                puts("HW address is:");                printf("%02x:%02x:%02x:%02x:%02x:%02x\n",                     (unsigned char) buf[intrface].ifr_hwaddr.                     sa_data[0],                     (unsigned char) buf[intrface].ifr_hwaddr.                     sa_data[1],                     (unsigned char) buf[intrface].ifr_hwaddr.                     sa_data[2],                     (unsigned char) buf[intrface].ifr_hwaddr.                     sa_data[3],                     (unsigned char) buf[intrface].ifr_hwaddr.                     sa_data[4],                     (unsigned char) buf[intrface].ifr_hwaddr.                     sa_data[5]);                puts("");                puts("");            }            else {                char str[256];                sprintf(str, "cpm: ioctl device %s",                      buf[intrface].ifr_name);                perror(str);            }          }      } else          perror("cpm: ioctl");    } else      perror("cpm: socket");    close(fd);    return retn;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?