linux - 获取 MAC 地址问题 Linux(Ubuntu)

标签 linux ubuntu

我有下面的 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 数据,但是当我打印出来时,我没有得到正确的值。它可能是什么问题。

最佳答案

sa_data 中的地址不是文本形式,它是原始二进制形式,因此您需要自己将其格式化为十六进制。您也不能使用 sizeof 来获取地址的大小,因为 sa_data 是一个通用大小的数组 - 您需要查看 sa_len member 获取这个地址的长度。在 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");

关于linux - 获取 MAC 地址问题 Linux(Ubuntu),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6674313/

相关文章:

regex - journalctl使用正则表达式搜索元数据

Eclipse mars 图标未在 Ubuntu 14.04 上显示

linux - 在 bash 脚本中实现一个简单版本的查找

linux - 如何在 Ubuntu 11.10 上安装 gcc 4.4.6

linux - sublimeRepl 不会使用回车键输入

c++ - 在 Ubuntu 上安装 Qt

ubuntu - 在 Ubuntu 上合并多个(两个以上)视频

php - 多 PHP 如何在 Ubuntu 14.04 上安装带有 PEAR 和扩展的 php 5.3

Linux 脚本以秒为单位获取上次修改文件夹的时间

linux - Linux inotify API 的效率如何?