ioctl(sock, SIOCGIFHWADDR, &ifr)函数中 SIOCGIFHWADDR 用来获取网卡硬件地址(MAC地址
typedef struct _get_mac_
{
char mac[32];
char brifc[32];
}GETMAC;
static int get_mac(GETMAC * getmac)
{
struct ifreq tmp;
int sock_mac;
char mac_addr[32]={0};
sock_mac = socket(AF_INET, SOCK_STREAM, 0);
if( sock_mac == -1)
{
perror("create socket fail\n");
return -1;
}
memset(&tmp,0,sizeof(tmp));
strncpy(tmp.ifr_name,getmac->brifc,sizeof(tmp.ifr_name)-1 );
if( (ioctl( sock_mac, SIOCGIFHWADDR, &tmp)) < 0 )
{
printf("mac ioctl error\n");
return -1;
}
sprintf(mac_addr, "%02x:%02x:%02x:%02x:%02x:%02x",\
(unsigned char)tmp.ifr_hwaddr.sa_data[0],
(unsigned char)tmp.ifr_hwaddr.sa_data[1],
(unsigned char)tmp.ifr_hwaddr.sa_data[2],
(unsigned char)tmp.ifr_hwaddr.sa_data[3],
(unsigned char)tmp.ifr_hwaddr.sa_data[4],
(unsigned char)tmp.ifr_hwaddr.sa_data[5]
);
close(sock_mac);
memcpy(getmac->mac,mac_addr,strlen(mac_addr));
return 0;
}