- 论坛徽章:
- 0
|
找来了一个代码,你自己改改吧,适用OS:linux, freebsd, solaris.
int GetMacIP(char MAC[], char IP[])
{
register int fd, intrface, retn = 0;
register int up, ip, mac;
struct ifreq buf[MAX_NET_CARDS];
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);
while (intrface-- > 0)
{
up = mac = ip = 0;
//Judge whether the net card status is up
if (!(ioctl (fd, SIOCGIFFLAGS, (char *) &buf[intrface])))
{
if (buf[intrface].ifr_flags & IFF_PROMISC)
{
// puts ("the interface is PROMISC");
}
}
if (buf[intrface].ifr_flags & IFF_UP)
{
up = 1;
}
//Get IP of the net card
if (!(ioctl (fd, SIOCGIFADDR, (char *) &buf[intrface])))
{
//get ip address
memset(IP, 0, 20);
sprintf(IP, "%s",
(char*)inet_ntoa(((struct sockaddr_in*)
(&buf[intrface].ifr_addr))->sin_addr));
// printf("IP %s\n",IP);
ip = 1;
}
#ifdef __sun__
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)))
{
mac = 1;
//Get HW address
memset(MAC, '\0', 20);
sprintf(MAC ,"%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]);
}
#else
#if 0
//Get HW ADDRESS of the net card
if (!(ioctl (fd, SIOCGENADDR, (char *) &buf[intrface])))
{
mac = 1;
memset(MAC, '\0', 20);
sprintf(MAC, "%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]);
}
#endif
if (!(ioctl (fd, SIOCGIFHWADDR, (char *) &buf[intrface])))
{
mac = 1;
memset(MAC, 0, 20);
sprintf(MAC, "%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]);
// printf("MAC %s\n", MAC);
}
#endif
if(ip && mac && up )
{
close(fd);
return 1;
}
}//end of while()
} //end of ioctl()
} //end of if socket
close (fd);
return 0;
}
|
|
|