在日常开发中,我们常常需要获取设备的硬件信息,比如 MAC 地址。MAC 地址是网络接口卡(Network Interface Card, NIC)的唯一标识符,在网络通信中起着重要作用。本文将介绍如何使用 C 语言实现获取本地设备的 MAC 地址。
一、背景知识
MAC 地址是一个长度为 48 位(6 字节)的二进制数字,通常以十六进制表示。它用于唯一标识网络设备,并且在网络层以下的通信中扮演重要角色。获取 MAC 地址的方法因操作系统而异,这里我们将重点讨论在 Linux 和 Windows 系统中的实现方式。
二、Linux 平台下的实现
在 Linux 系统中,可以通过读取 `/sys/class/net/` 目录下的文件来获取网卡的 MAC 地址。每个网卡目录下都有一个 `address` 文件,里面存储了对应的 MAC 地址。
```c
include
include
void get_mac_address_linux() {
FILE fp;
char path[100];
snprintf(path, sizeof(path), "/sys/class/net/%s/address", "eth0"); // 替换为实际网卡名称
fp = fopen(path, "r");
if (fp == NULL) {
perror("Failed to open MAC address file");
return;
}
char mac[20];
if (fgets(mac, sizeof(mac), fp) != NULL) {
printf("MAC Address: %s", mac);
}
fclose(fp);
}
```
三、Windows 平台下的实现
在 Windows 平台上,可以使用 WinSock API 来获取网卡的 MAC 地址。通过调用 `GetAdaptersAddresses` 函数,我们可以遍历所有网络适配器并提取其物理地址。
```c
include
include
include
include
pragma comment(lib, "IPHLPAPI.lib")
void get_mac_address_windows() {
ULONG outBufLen = 0;
IP_ADAPTER_ADDRESSES pAdapterAddresses = NULL, pTempAdapterAddresses;
// First call to GetAdaptersAddresses to determine the buffer size
GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, pAdapterAddresses, &outBufLen);
pAdapterAddresses = (IP_ADAPTER_ADDRESSES )malloc(outBufLen);
if (!pAdapterAddresses) {
printf("Memory allocation failed\n");
return;
}
if (GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, pAdapterAddresses, &outBufLen) == NO_ERROR) {
for (pTempAdapterAddresses = pAdapterAddresses; pTempAdapterAddresses != NULL; pTempAdapterAddresses = pTempAdapterAddresses->Next) {
if (pTempAdapterAddresses->PhysicalAddressLength != 0) {
printf("MAC Address: ");
for (int i = 0; i < pTempAdapterAddresses->PhysicalAddressLength; i++) {
printf("%02X%s", pTempAdapterAddresses->PhysicalAddress[i], (i == pTempAdapterAddresses->PhysicalAddressLength - 1) ? "\n" : "-");
}
}
}
}
free(pAdapterAddresses);
}
```
四、总结
通过上述代码示例,我们可以看到在不同操作系统中获取 MAC 地址的方法各有特点。Linux 下的实现相对简单,直接读取系统文件即可;而在 Windows 下则需要借助 WinSock API 来完成。无论是哪种方法,都需要对目标平台有一定的了解才能正确实现。
希望这篇文章能够帮助大家更好地理解如何用 C 语言获取设备的 MAC 地址。如果有任何疑问或需要进一步的帮助,请随时留言交流!