getifaddrs
是一个在 Unix/Linux 系统中用于获取网络接口地址信息的函数。它可以用来列出系统上所有网络接口及其相关的地址信息。
函数原型
#include <sys/types.h>
#include <ifaddrs.h>
int getifaddrs(struct ifaddrs **ifa);
void freeifaddrs(struct ifaddrs *ifa);
参数说明
struct ifaddrs **ifa
: 指向结构体ifaddrs
的指针,用于存储链表的头指针。
返回值
- 成功时返回
0
,失败时返回-1
,并设置 errno 以指示错误类型。
使用方法
- 调用
getifaddrs
获取网络接口信息。 - 遍历返回的链表,访问每个接口的信息。
- 使用
freeifaddrs
释放分配的内存。
示例代码
下面是一个简单示例,展示如何使用 getifaddrs
列出所有网络接口及其地址:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
struct ifaddrs *interfaces, *temp_addr;
// 获取网络接口信息
if (getifaddrs(&interfaces) == -1) {
perror("getifaddrs");
return EXIT_FAILURE;
}
temp_addr = interfaces;
// 遍历并打印每个接口的信息
while (temp_addr != NULL) {
printf("Interface: %s\n", temp_addr->ifa_name);
// 检查地址族(IPv4或IPv6)
if (temp_addr->ifa_addr->sa_family == AF_INET) {
char address[INET_ADDRSTRLEN];
struct sockaddr_in *addr_in = (struct sockaddr_in *)temp_addr->ifa_addr;
inet_ntop(AF_INET, &addr_in->sin_addr, address, sizeof(address));
printf(" Address: %s\n", address);
} else if (temp_addr->ifa_addr->sa_family == AF_INET6) {
char address[INET6_ADDRSTRLEN];
struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)temp_addr->ifa_addr;
inet_ntop(AF_INET6, &addr_in6->sin6_addr, address, sizeof(address));
printf(" Address: %s\n", address);
}
temp_addr = temp_addr->ifa_next; // 移动到下一个接口
}
freeifaddrs(interfaces); // 释放内存
return EXIT_SUCCESS;
}
这个示例程序会列出所有网络接口及其对应的 IPv4 和 IPv6 地址。如果您在 Unix/Linux 系统上编译和运行这段代码,会得到类似以下输出:
Interface: lo
Address: 127.0.0.1
Interface: eth0
Address: 192.168.1.10
...
注意:要编译这段代码,请确保链接了正确的库,并在 POSIX 环境中运行。
内容由零声教学AI助手提供,问题来源于学员提问