我已经获得了MAC地址。
struct ifreq ifr;
struct ifreq *IFR;
struct ifconf ifc;
char buf[1024];
int s, i;
int ok = 0;
string macAddr = "";
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s==-1) {
return;
}
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
ioctl(s, SIOCGIFCONF, &ifc);
IFR = ifc.ifc_req;
for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; IFR++) {
strcpy(ifr.ifr_name, IFR->ifr_name);
if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) {
if (! (ifr.ifr_flags & IFF_LOOPBACK)) {
if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
ok = 1;
break;
}
}
}
}
close(s);
int p = sizeof(ifr.ifr_hwaddr.sa_data);
cout<<"\n Size:"<<p<<"\n";
for(int i = 0; i < p; i++)
macAddr += ifr.ifr_hwaddr.sa_data[i];
cout<<"\n MAC Address:"<<macAddr<<"\n";
我得到了ifr.ifr_hwaddr.sa_data
数据,但是当我打印出来时,我得不到合适的价值。它可能是什么问题。
答案 0 :(得分:1)
sa_data
中的地址不是文本形式,它是原始二进制形式,因此您需要自己将其格式化为十六进制。您也无法使用sizeof
来获取地址的大小,因为sa_data
是一个通用大小的数组 - 您需要查看sa_len
成员以获取此地址的长度。在C中你想要这样的东西:
char *separator = "";
for (int i = 0; i < ifr.ifr_hwaddr.sa_len; i++)
{
printf("%s%02x", separator, ifr.ifr_hwaddr.sa_data[i]);
separator = ":";
}
printf("\n");