ZBLOG

getifaddrs

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;
}

程序解释

  1. 调用 getifaddrs 获取系统中所有网络接口的信息,并将结果存储在 interfaces 中。
  2. 遍历 interfaces 链表,对于每个网络接口,检查其地址类型(IPv4 或 IPv6)。
  3. 使用 inet_ntop 将地址转换为可读格式,然后打印出来。
  4. 最后调用 freeifaddrs 释放由 getifaddrs 分配的内存。

注意事项

  • 确保在使用完返回的链表后调用 freeifaddrs() 函数以释放资源。
  • 在处理不同类型的地址时,要注意相应地处理它们(例如,区分 IPv4 和 IPv6)。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=6520

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?