在Linux下,可以使用C语言通过多种方式获取MAC地址。最常用的方法是通过网络接口的系统文件或使用相关的socket API。以下是两种常见方法来获取MAC地址。
方法 1: 使用getifaddrs
这个方法利用了getifaddrs
函数,它可以获得本地所有网络接口的信息,包括MAC地址。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ifaddrs.h>
#include <net/ethernet.h> // For ethernet_addr
#include <arpa/inet.h>
void print_mac_address(unsigned char *mac) {
printf("MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}
int main() {
struct ifaddrs *ifaddr, *ifa;
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
return EXIT_FAILURE;
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_PACKET) { // Check for Ethernet
unsigned char *mac = (unsigned char *)LLADDR((struct sockaddr_dl *)ifa->ifa_addr);
print_mac_address(mac);
}
}
freeifaddrs(ifaddr);
return EXIT_SUCCESS;
}
方法 2: 使用Socket编程和ioctl
这个方法使用了socket编程,结合ioctl
调用来获取特定网络接口的MAC地址。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <unistd.h>
void get_mac_address(const char *interface) {
int fd;
struct ifreq iface;
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
strncpy(iface.ifr_name, interface, IFNAMSIZ - 1);
// 获取 MAC 地址
if (ioctl(fd, SIOCGIFHWADDR, &iface) == -1) {
perror("ioctl");
close(fd);
exit(EXIT_FAILURE);
}
unsigned char *mac = (unsigned char *)iface.ifr_hwaddr.sa_data;
printf("MAC address of %s: %02x:%02x:%02x:%02x:%02x:%02x\n",
interface,
mac[0], mac[1], mac[2],
mac[3], mac[4], mac[5]);
close(fd);
}
int main() {
get_mac_address("eth0"); // 将 "eth0" 替换为你想要查询的网卡名称
return 0;
}
编译和运行
将上面的代码保存到一个C源文件中,例如 get_mac.c
,然后使用gcc编译:
gcc get_mac.c -o get_mac
然后运行程序:
./get_mac
注意:
- 在第二个示例中,你需要根据你的实际网络接口名替换
"eth0"
(例如可能是"enp0s3"
或其他名称)。 - 上述代码需要适当的权限,有时需要以root用户身份运行。
内容由零声教学AI助手提供,问题来源于学员提问