在 Linux C 中可以使用以下方法获取网卡的 MAC 地址:
1. 使用 `ifconfig` 命令:
```c
#include
#include
#include
#include
#include
#include
#include
#include
int main() {
int fd;
struct ifreq ifr;
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd == -1) {
perror("socket");
return 1;
}
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ - 1); // 替换为目标网卡名称
if (ioctl(fd, SIOCGIFHWADDR, &ifr) == 0) {
printf("MAC Address: %02X:%02X:%02X:%02X:%02X:%02X\n",
(unsigned char)ifr.ifr_hwaddr.sa_data[0],
(unsigned char)ifr.ifr_hwaddr.sa_data[1],
(unsigned char)ifr.ifr_hwaddr.sa_data[2],
(unsigned char)ifr.ifr_hwaddr.sa_data[3],
(unsigned char)ifr.ifr_hwaddr.sa_data[4],
(unsigned char)ifr.ifr_hwaddr.sa_data[5]);
} else {
perror("ioctl");
return 1;
}
close(fd);
return 0;
}
```
2. 使用 `getifaddrs` 函数:
```c
#include
#include
#include
#include
#include
int main() {
struct ifaddrs *ifaddr, *ifa;
int family, s;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
return 1;
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL)
continue;
family = ifa->ifa_addr->sa_family;
if (family == AF_PACKET && (ifa->ifa_flags & IFF_LOOPBACK) == 0) {
printf("Interface: %s\n", ifa->ifa_name);
printf("MAC Address: ");
for (s = 0; s < 6; s++) {
if (s == 0) printf("%.2x", (unsigned char)ifa->ifa_addr->sa_data[s]);
else printf(":%.2x", (unsigned char)ifa->ifa_addr->sa_data[s]);
}
printf("\n");
}
}
freeifaddrs(ifaddr);
return 0;
}
```
这两种方法都可以获取网卡的 MAC 地址。第一种方法使用 `ioctl` 系统调用获取 MAC 地址,第二种方法使用 `getifaddrs` 函数获取。根据您的需求,选择合适的方法即可。