【问题标题】:getnameinfo returning numeric name with "%<interface>"getnameinfo 返回带有“%<interface>”的数字名称
【发布时间】:2014-03-24 14:16:27
【问题描述】:

我使用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 地址?

【问题讨论】:

    标签: linux network-programming ip ipv6


    【解决方案1】:

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

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

    【讨论】:

    • “因此,在不指定哪个网络适配器的情况下指定链接本地地址是没有意义的”——考虑到该死的东西是 16 个字节,他们到底是如何设法用完 IPv6 地址的?它不像他们没有空间为低 8 个八位字节中的索引提供 4 位或 6 位的空间……下一步是什么? IPv9 这样他们真的可以提供所有需要的地址吗?
    • @noloader:IPv6 地址没有用完,链路本地地址对于自动配置、路由协议和 ZeroConf/Bonjour 风格的服务非常有用。请记住,IPv6 每个接口有多个地址,因此在链接本地地址旁边通常有几个全球单播地址。
    猜你喜欢
    • 1970-01-01
    • 2013-10-23
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多