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维护单独的接口索引。 “
”因此,指定一个链接本地地址没有指定哪个网络适配器是没有意义的 - 如何在地狱中设法使用IPv6地址,因为该死的东西是16字节?它不像4位或6位那样没有足够的空间用于下8个八位字节的索引......下一步是什么? [IPv9](http://tools.ietf.org/html/rfc1606),以便他们真的可以提供所有必需的地址? – jww
@noloader:IPv6地址没有用完,链路本地地址对于自动配置,路由协议和ZeroConf/Bonjour风格的服务非常有用。请记住,IPv6在每个接口上有多个地址,所以在链路本地地址旁边通常有几个全球单播地址。 –