getnameinfo返回带有“%<interface>”</interface>的数字名称

时间:2014-02-22 23:21:50

标签: linux network-programming ip ipv6

我正在使用getnameinfo,如下所示:

ifaddrs *ifaddr = NULL, *ifa = NULL;
int rc, family, insize;

rc = getifaddrs(&ifaddr);
...

for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
    family = ifa->ifa_addr->sa_family
    insize = (family == AF_INET) ?
            (int)sizeof(struct sockaddr_in) :
            (int)sizeof(struct sockaddr_in6);

    char host[HOST_NAME_MAX];
    rc = getnameinfo(ifa->ifa_addr, insize,
            host, sizeof(host), NULL, 0, NI_NUMERICHOST);
}
...

当函数返回IPv6地址时,它包含附加到数字IP地址的接口:

fe80::62a4:4cff:fe05:dc1b%eth0

将接口附加到数字IP地址的目的是什么?

是否有可用的标志来控制接口附加到IP地址?

1 个答案:

答案 0 :(得分:2)

fe80::*地址范围为link-local,这意味着该地址仅对该特定网络有效,同一地址可能引用不同网络上的差异主机。因此,指定链路本地地址而不指定哪个网络适配器是没有意义的。此外,DNS在链接本地范围之外变得毫无意义,例如由ZeroConf / multicast-DNS提供。

Unix主机倾向于按名称指定适配器,Windows主机将按索引指定适配器。请注意,Windows为IPv4和IPv6维护单独的接口索引。