// 利用ioctl获取本机指定设备的MAC地址
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/ioctl.h>
#include<net/if.h>
#include<netinet/ip.h>
#include<net/if_arp.h>
#include<sys/sysctl.h>
int main(int argc, char **argv)
{
struct sockaddr_in *addr;
struct ifreq ifr;
unsigned char *mac;
char *address;
int sockfd;
if (argc < 2)
{
printf("Usage : %s interface\n", argv[0]);
return 1;
}
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);
if (ioctl(sockfd, SIOCGIFADDR, &ifr) == -1)
{
perror("ioctl");
exit(1);
}
addr = (struct sockaddr_in *)&(ifr.ifr_addr);
address = inet_ntoa(addr->sin_addr);
printf("inet addr: %s\n", address);
if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) == -1)
{
perror("ioctl error");
exit(1);
}
mac = (unsigned char*)(ifr.ifr_hwaddr.sa_data);
printf("mac address: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
printf("%d: [%s]----\n", strlen(mac), mac);
return 0;
}
运行结果:
[zcm@t #113]$make
gcc -c -o a.o a.c
gcc -o a a.o
[zcm@t #114]$./a eth1
inet addr: 172.25.25.97
mac address: 00:0c:29:63:38:81
0: []----
[zcm@t #115]$./a eth0
ioctl: No such device
[zcm@t #116]$