【问题标题】:how to get IPV6 interface address using getifaddr() function [duplicate]如何使用 getifaddr() 函数获取 IPV6 接口地址
【发布时间】:2016-01-12 13:32:09
【问题描述】:

我有getifaddrs() 的定义,但它是针对 IPv4 的。请指导我如何使用getifaddrs() 函数获取地址。

【问题讨论】:

  • getifaddrs() 支持 IPv6。

标签: c sockets ipv6


【解决方案1】:

getifaddrs 确实支持 IPv6。下面是一个关于如何打印系统上所有接口的名称和 IP 地址的示例:

struct ifaddrs *ifa, *ifa_tmp;
char addr[INET6_ADDRSTRLEN];

if (getifaddrs(&ifa) == -1) {
    perror("getifaddrs failed");
    exit(1);
}

ifa_tmp = ifa;
while (ifa_tmp) {
    if ((ifa_tmp->ifa_addr) && ((ifa_tmp->ifa_addr->sa_family == AF_INET) ||
                              (ifa_tmp->ifa_addr->sa_family == AF_INET6))) {
        if (ifa_tmp->ifa_addr->sa_family == AF_INET) {
            // create IPv4 string
            struct sockaddr_in *in = (struct sockaddr_in*) ifa_tmp->ifa_addr;
            inet_ntop(AF_INET, &in->sin_addr, addr, sizeof(addr));
        } else { // AF_INET6
            // create IPv6 string
            struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa_tmp->ifa_addr;
            inet_ntop(AF_INET6, &in6->sin6_addr, addr, sizeof(addr));
        }
        printf("name = %s\n", ifa_tmp->ifa_name);
        printf("addr = %s\n", addr);
    }
    ifa_tmp = ifa_tmp->ifa_next;
}
freeifaddrs(ifa);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多