与C linux中的ipv6作用域相比,如何查找ipv4地址作用域名称(链接,主机和全局)

时间:2014-05-26 06:25:10

标签: c linux sockets ipv6 ipv4

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

匹配我的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");
}