ZBLOG

getifaddrs

getifaddrs() 是一个用于获取系统中所有网络接口地址信息的函数。它在 POSIX 标准中定义,并主要用于 Unix-like 系统(如 Linux 和 macOS)。该函数可以帮助开发者获取有关每个网络接口(如 Ethernet、Wi-Fi 等)的详细信息,包括其 IP 地址、状态等。

函数原型

#include <ifaddrs.h>

int getifaddrs(struct ifaddrs **ifap);

参数

  • ifap: 这是一个指向 struct ifaddrs* 的指针的指针。函数调用后,它将指向一个链表,每个节点表示一个网络接口的信息。

返回值

  • 成功时,返回 0。
  • 失败时,返回 -1,并设置 errno 以指示错误类型。

struct ifaddrs

这是 getifaddrs() 返回的数据结构,用于表示每个网络接口的信息。其定义如下:

struct ifaddrs {
    char *ifa_name;            // 接口名称,例如 "eth0"
    unsigned int ifa_flags;    // 接口标志,比如 IFF_UP, IFF_RUNNING 等
    struct sockaddr *ifa_addr; // 指向地址结构,如 sockaddr_in (IPv4) 或 sockaddr_in6 (IPv6)
    struct sockaddr *ifa_netmask; // 指向子网掩码结构
    struct sockaddr *ifa_ifu;      // 接口专用信息
    struct ifaddrs *ifa_next;      // 指向下一个接口的信息
};

使用示例

以下是一个简单示例,展示了如何使用 getifaddrs() 获取并打印本地系统的网络接口名称和对应的 IP 地址:

#include <iostream>
#include <ifaddrs.h>
#include <arpa/inet.h>

void printNetworkInterfaces() {
    struct ifaddrs *interfaces, *ifa;
    
    if (getifaddrs(&interfaces) == -1) {
        perror("getifaddrs");
        return;
    }
    
    for (ifa = interfaces; ifa != nullptr; ifa = ifa->ifa_next) {
        if (ifa->ifa_addr == nullptr)
            continue;

        void* addr;
        std::string ipAddress;

        // Check the family of the address and process accordingly.
        switch (ifa->ifa_addr->sa_family) {
            case AF_INET: { // IPv4
                addr = &((struct sockaddr_in*)ifa->ifa_addr)->sin_addr;
                char buffer[INET_ADDRSTRLEN];
                inet_ntop(AF_INET, addr, buffer, sizeof(buffer));
                ipAddress = buffer;
                break;
            }
            case AF_INET6: { // IPv6
                addr = &((struct sockaddr_in6*)ifa->ifa_addr)->sin6_addr;
                char buffer[INET6_ADDRSTRLEN];
                inet_ntop(AF_INET6, addr, buffer, sizeof(buffer));
                ipAddress = buffer;
                break;
            }
            default:
                continue; // Skip unsupported address families.
        }

        std::cout << "Interface: " << ifa->ifa_name << ", IP Address: " << ipAddress << std::endl;
    }

    freeifaddrs(interfaces); // Free the allocated memory for interface addresses.
}

int main() {
    printNetworkInterfaces();
    return 0;
}

注意事项

  • 在调用完 getifaddrs() 后,务必调用 freeifaddrs() 来释放分配给链表的内存,以避免内存泄漏。
  • 在多线程程序中,getifaddrs() 是安全的,但需要注意对返回结果的处理和存储。

这个函数对于编写与网络相关的软件非常有用,可以让你轻松获取本机的各种网络配置和状态。如果你还有其他问题或需要更深入的解释,请告诉我!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?