#include static int get_mac(const char *ifname, unsigned char *mac, int len);
static int get_mac(const char *ifname, unsigned char *mac, int len)
{
int isocket = -1, iret = 0;
struct ifreq ifreq;
if (ifname == NULL || mac == NULL)
{
printf("invalid param\n");
return -1;
}
isocket = socket(AF_INET, SOCK_STREAM, 0);
if (isocket < 0)
{
printf("create socket error\n");
iret = -1;
goto End;
}
strcpy(ifreq.ifr_name, ifname);
if (ioctl(isocket, SIOCGIFHWADDR, &ifreq) < 0)
{
printf("ioctrl error\n");
iret = -1;
goto End;
}
memcpy(mac, (unsigned char *)ifreq.ifr_hwaddr.sa_data, 6);
End:
if (isocket >= 0)
close(isocket);
return iret;
}
int main(int argc, char **argv)
{
unsigned char mac[12];
char acMac1[32] = {0};
char acMac2[32] = {0};
char acMac3[32] = {0};
char acMac4[32] = {0};
unsigned long long ullmac1 = 0;
unsigned long long ullmac2 = 0;
unsigned int a1 = 0;
unsigned int a2 = 0;
unsigned int a3 = 0;
unsigned int a4 = 0;
unsigned int a5 = 0;
unsigned int a6 = 0;
// 获取mac地址
if (get_mac("eth2", mac, sizeof(mac)) < 0)
{
printf("get_mac error\n");
return -1;
}
// 转换mac地址格式
snprintf(acMac1, sizeof(acMac1),"%02X:%02X:%02X:%02X:%02X:%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
snprintf(acMac2, sizeof(acMac2),"%02X%02X%02X%02X%02X%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
printf("acMac1[%s]\n", acMac1);
printf("acMac2[%s]\n", acMac2);
// mac地址转换为无符号16位整型
ullmac1 = strtoull(acMac2, NULL, 16);
// 对数值执行操作
ullmac2 = ullmac1 + 1;
printf("ullmac1[%llu]\n",ullmac1);
printf("ullmac2[%llu]\n",ullmac2);
// 对操作之后的数值,重新转换为mac地址格式
a1 = (ullmac2 >> 40) & 0xFF;
a2 = (ullmac2 >> 32) & 0xFF;
a3 = (ullmac2 >> 24) & 0xFF;
a4 = (ullmac2 >> 16) & 0xFF;
a5 = (ullmac2 >> 8) & 0xFF;
a6 = (ullmac2) & 0xFF;
snprintf(acMac3, sizeof(acMac3),"%02X:%02X:%02X:%02X:%02X:%02X",a1,a2,a3,a4,a5,a6);
snprintf(acMac4, sizeof(acMac4),"%02X%02X%02X%02X%02X%02X",a1,a2,a3,a4,a5,a6);
printf("acMac3[%s]\n", acMac3);
printf("acMac4[%s]\n", acMac4);
return 0;
}