getnameinfo会以“%”返回数字名称

问题描述:

我使用getnameinfo如下:getnameinfo会以“%<interface>”返回数字名称

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地址接口的附加?

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

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

+0

”因此,指定一个链接本地地址没有指定哪个网络适配器是没有意义的 - 如何在地狱中设法使用IPv6地址,因为该死的东西是16字节?它不像4位或6位那样没有足够的空间用于下8个八位字节的索引......下一步是什么? [IPv9](http://tools.ietf.org/html/rfc1606),以便他们真的可以提供所有必需的地址? – jww

+0

@noloader:IPv6地址没有用完,链路本地地址对于自动配置,路由协议和ZeroConf/Bonjour风格的服务非常有用。请记住,IPv6在每个接口上有多个地址,所以在链路本地地址旁边通常有几个全球单播地址。 –