getifaddrs
是一个用于获取本地网络接口地址的函数。它属于 POSIX 标准,通常在 Unix-like 系统中可用,如 Linux 和 macOS。该函数返回一个链表,其中包含所有网络接口及其相关的地址信息。
函数原型
#include <sys/types.h>
#include <ifaddrs.h>
int getifaddrs(struct ifaddrs **ifa);
void freeifaddrs(struct ifaddrs *ifa);
参数说明
ifa
: 指向指针的指针,用于存储生成的struct ifaddrs
链表的头部地址。
返回值
- 成功时返回 0。
- 如果失败,返回 -1,并且可以通过
errno
获取错误代码。
结构体定义
struct ifaddrs
的基本结构如下:
struct ifaddrs {
struct ifaddrs *ifa_next; // 指向下一个接口的指针
char *ifa_name; // 接口名称
unsigned int ifa_flags; // 接口标志
struct sockaddr *ifa_addr; // 地址结构体指针
struct sockaddr *ifa_netmask; // 子网掩码结构体指针
void *ifa_data; // 特定于接口的数据
};
示例代码
下面是一个简单示例,演示如何使用 getifaddrs
来列出所有网络接口及其 IP 地址:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ifaddrs.h>
#include <arpa/inet.h>
int main() {
struct ifaddrs *interfaces, *temp;
// 获取所有网络接口信息
if (getifaddrs(&interfaces) == -1) {
perror("getifaddrs");
return EXIT_FAILURE;
}
temp = interfaces;
while (temp != NULL) {
char addr[INET6_ADDRSTRLEN]; // 为IPv4和IPv6预留空间
// 检查地址类型并转换为字符串格式
if (temp->ifa_addr->sa_family == AF_INET) { // IPv4
inet_ntop(AF_INET, &((struct sockaddr_in *)temp->ifa_addr)->sin_addr, addr, sizeof(addr));
printf("Interface: %s\tAddress: %s\n", temp->ifa_name, addr);
} else if (temp->ifa_addr->sa_family == AF_INET6) { // IPv6
inet_ntop(AF_INET6, &((struct sockaddr_in6 *)temp->ifa_addr)->sin6_addr, addr, sizeof(addr));
printf("Interface: %s\tAddress: %s\n", temp->ifa_name, addr);
}
temp = temp->ifa_next; // 移动到下一个接口
}
freeifaddrs(interfaces); // 释放分配的内存
return EXIT_SUCCESS;
}
程序解释
- 调用
getifaddrs
获取系统中所有网络接口的信息,并将结果存储在interfaces
中。 - 遍历
interfaces
链表,对于每个网络接口,检查其地址类型(IPv4 或 IPv6)。 - 使用
inet_ntop
将地址转换为可读格式,然后打印出来。 - 最后调用
freeifaddrs
释放由getifaddrs
分配的内存。
注意事项
- 确保在使用完返回的链表后调用
freeifaddrs()
函数以释放资源。 - 在处理不同类型的地址时,要注意相应地处理它们(例如,区分 IPv4 和 IPv6)。
内容由零声教学AI助手提供,问题来源于学员提问