【发布时间】:2014-07-14 20:42:12
【问题描述】:
这里我不是在谈论范围 ID,而是关于范围名称(主机、链接、站点或全局)。 如何比较/获取 ipv4 地址以及 ipv6 的范围。
【问题讨论】:
-
IPv4 不像 IPv6 那样拥有一套完整的范围。您应该更清楚地定义您想要确定的有关您正在使用的 IPv4 地址的哪些信息。
这里我不是在谈论范围 ID,而是关于范围名称(主机、链接、站点或全局)。 如何比较/获取 ipv4 地址以及 ipv6 的范围。
【问题讨论】:
直接的解决方案是将地址与来自this list on Wikipedia 的前缀进行比较。
【讨论】:
为了匹配我的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");
}
【讨论】: