linux和solaris获取mac地址等信息

#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; 
}  

 

posted @ 2014-04-08 22:13  韶纥  阅读(466)  评论(0)    收藏  举报