#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> #ifdef SOLARIS #include <sys/sockio.h> #endif #define MAXINTERFACES 16 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); //根据借口信息循环获取设备IP和MAC地址
while (intrface-- > 0) { //获取设备名称
printf ("net device %s\n", buf[intrface].ifr_name);
//判断网卡类型
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); } //判断网卡状态
if (buf[intrface].ifr_flags & IFF_UP) { puts("the interface status is UP" ); } else { puts("the interface status is DOWN" ); } //获取当前网卡的IP地址
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); } /* this section can't get Hardware Address,I don't know whether the reason is module driver*/ #ifdef SOLARIS //获取MAC地址
arp.arp_pa.sa_family = AF_INET; arp.arp_ha.sa_family = AF_INET; ((struct sockaddr_in*)&arp.arp_pa)->sin_addr.s_addr=((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr.s_addr; if (!(ioctl (fd, SIOCGARP, (char *) &arp))) { puts ("HW address is:" ); //以十六进制显示MAC地址
printf("%02x:%02x:%02x:%02x:%02x:%02x\n", (unsigned char)arp.arp_ha.sa_data[0], (unsigned char)arp.arp_ha.sa_data[1], (unsigned char)arp.arp_ha.sa_data[2], (unsigned char)arp.arp_ha.sa_data[3], (unsigned char)arp.arp_ha.sa_data[4], (unsigned char)arp.arp_ha.sa_data[5]); puts("" ); puts("" ); }
#else #if 0 /*Get HW ADDRESS of the net card */ if (!(ioctl (fd, SIOCGENADDR, (char *) &buf[intrface]))) { puts ("HW address is:" ); printf("%02x:%02x:%02x:%02x:%02x:%02x\n", (unsigned char)buf[intrface].ifr_enaddr[0], (unsigned char)buf[intrface].ifr_enaddr[1], (unsigned char)buf[intrface].ifr_enaddr[2], (unsigned char)buf[intrface].ifr_enaddr[3], (unsigned char)buf[intrface].ifr_enaddr[4], (unsigned char)buf[intrface].ifr_enaddr[5]); puts("" ); puts("" ); } #endif 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("" ); } #endif else { char str[256]; sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name); perror (str); } } //while
} else perror ("cpm: ioctl" ); } else perror ("cpm: socket" ); close (fd); return retn; }
|