Linux系统
在Linux系统,可以通过系统调用函数ioctl很容易就获取到服务器的mac地址。#include
#include
#include
#include
#include
#include
int main()
{
int sock, if_count, i;
struct ifconf ifc;
struct ifreq ifr[10];
unsigned char mac[6];
memset(&ifc, 0, sizeof(struct ifconf));
sock = socket(AF_INET, SOCK_DGRAM, 0);
ifc.ifc_len = 10 * sizeof(struct ifreq);
ifc.ifc_buf = (char *)ifr;
//获取所有网卡信息
ioctl(sock, SIOCGIFCONF, (char *)&ifc);
if_count = ifc.ifc_len / (sizeof(struct ifreq));
for (i = 0; i < if_count; i++) {
if (ioctl(sock, SIOCGIFHWADDR, &ifr[i]) == 0) {
memcpy(mac, ifr[i].ifr_hwaddr.sa_data, 6);
printf("eth: %s, mac: %02x:%02x:%02x:%02x:%02x:%02x\n", ifr[i].ifr_name, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}
}
return 0;
}
核心逻辑主要分两个部分,第一个部分是获取网卡,主要通过下面的函数完成:ioctl(sock, SIOCGIFCONF, (char *)&ifc);
它的信息保存在结构体struct ifconf中,有可能不止一个。获取到的信息保存在ifc_buf中。
第二个逻辑就是根据网卡的名字去获取mac地址,主要用下面的函数完成:ioctl(sock, SIOCGIFHWADDR, &ifr[i]);
通过上面简单的两步,就能获取到Linux服务器上所有的网卡对应的mac地址。
当前操作系统信息:[root@vm101108 src]# uname -a
Linux vm101108 3.10.0-1160.15.2.el7.x86_64 #1 SMP Wed Feb 3 15:06:38 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
[root@vm101108 src]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID=&#