【问题标题】:how to find ipv4 address scope name (link, host and global) as compared with ipv6 scope in C linux与 C linux 中的 ipv6 范围相比,如何查找 ipv4 地址范围名称(链接、主机和全局)
【发布时间】:2014-07-14 20:42:12
【问题描述】:

这里我不是在谈论范围 ID,而是关于范围名称(主机、链接、站点或全局)。 如何比较/获取 ipv4 地址以及 ipv6 的范围。

【问题讨论】:

  • IPv4 不像 IPv6 那样拥有一套完整的范围。您应该更清楚地定义您想要确定的有关您正在使用的 IPv4 地址的哪些信息。

标签: c linux sockets ipv6 ipv4


【解决方案1】:

直接的解决方案是将地址与来自this list on Wikipedia 的前缀进行比较。

【讨论】:

  • Phillip:它只用于保留的 IP 地址。但我需要在任何类型的任何系统(ipv4 或 ipv6)中找到 IP 地址范围名称。
  • 有什么方法可以从 sin6_scope_id 获取作用域名称吗?
  • 通常我们做一个 struct ifaddrmsg *ifa = NLMSG_DATA(h);并使用 ifa->ifa_scope。但在我的范围内,我确实只有链接信息,即 struct ifinfomsg *。所以我无法提取地址范围,并且在 ifinfomsg 结构中没有范围字段。
  • 如果这不是您要搜索的内容,您能否指定 v4 地址范围的含义? (AFAIK,v4 没有超出这些的地址范围。)
  • 我的问题宁愿纠正为:如何获取 IPv4 主机的范围? stackoverflow.com/questions/11632284/… 用于 ipv6
【解决方案2】:

为了匹配我的IP6 answer:但是如前所述,IP4 分类是已载入 IP6 协议的建议,因此并不完全等同。

有辅助宏来辅助:

#define IN_LINKLOCAL(i) (((uint32_t)(i) & 0xffff0000) == 0xa9fe0000)
#define IN_PRIVATE(i)   ((((uint32_t)(i) & 0xff000000) == 0x0a000000) || \
                         (((uint32_t)(i) & 0xfff00000) == 0xac100000) || \
                         (((uint32_t)(i) & 0xffff0000) == 0xc0a80000))

struct sockaddr_in s4;
if (IN_LOOPBACK(ntohl(s4->sin_addr.s_addr)) {
  puts ("loopback");
} else if (IN_MULTICAST(ntohl(s4->sin_addr.s_addr)) {
  puts ("multicast");
} else if (IN_BADCLASS(ntohl(s4->sin_addr.s_addr)) {
  puts ("reserved");
} else if (IN_LINKLOCAL(ntohl(s4->sin_addr.s_addr)) {
  puts ("link-local");
} else if (IN_PRIVATE(ntohl(s4->sin_addr.s_addr)) {
  puts ("private");
} else {
  puts ("global");
}

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 2015-09-24
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2012-05-04
    • 2010-10-20
    相关资源
    最近更新 更多