首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试逐位IPv6网络掩码是否连续的有效方法

测试逐位IPv6网络掩码是否连续的有效方法
EN

Stack Overflow用户
提问于 2014-12-27 22:03:34
回答 2查看 582关注 0票数 4

我需要在in6/in6addr结构中存储IP地址/网络掩码。对于IPv4,我使用以下代码来测试网络掩码是否连续:

代码语言:javascript
复制
((((~netmask + 1) & (~netmask)) != 0)  && (netmask != 0))

我想知道是否有一个聪明的方法来为IPv6做同样的事情。

EN

回答 2

Stack Overflow用户

发布于 2014-12-27 23:23:03

有些编译器有128位整数。我曾经在一个AMD64架构上使用过由gcc编译的代码中的__uint128_t。

如果您使用的是具有128位整数的编译器,则可以简单地重用现有代码,因为它不会对字的大小做任何假设。

如果您需要使用较小的字长执行计算,它自然会变得更复杂,但不会太多。首先在掩码的字中运行指针,找到第一个零位的字(例如):

代码语言:javascript
复制
for (i = 0; i < 4 && netmask[i] != 0xffffffff; ++i)

接下来,您可以将原始测试应用于netmask[i],最后,您需要测试剩余的单词是否为零。

一种不同的方法是将原始测试应用于每个单独的单词,并进一步测试每一对单词的第一个为全一或第二个为全零:

代码语言:javascript
复制
int contiguous(uint32_t **netmask)
{
    int i;
    for (i = 0; i < 4; ++i) {
        if ((~netmask[i] + 1) & (~netmask[i])) return 0;
    }
    for (i = 0; i < 3; ++i) {
        if ((netmask[i] != 0xffffffff) && (netmask[i+1] != 0)) return 0;
    }
    return 1;
}

您还可以采用更常见的方法,不接受掩码作为输入,而是接受指定为0到128范围内的整数的前缀长度作为输入。然后,您可以自己构造位掩码,并知道它是连续的。

票数 1
EN

Stack Overflow用户

发布于 2015-01-07 05:19:53

我遇到了以下解决方案:

代码语言:javascript
复制
uint64_t netmask1, netmask2, netmask3;
netmask1 = (netmask.s6_addr32[0] << 32) + in6_netmask.s6_addr32[1];
netmask2 = (netmask.s6_addr32[1] << 32) + in6_netmask.s6_addr32[2];
netmask3 = (netmask.s6_addr32[2] << 32) + in6_netmask.s6_addr32[3];

如果其中一个部分不连续,则网络掩码不连续。

代码语言:javascript
复制
 if ((((~address1 + 1) & (~address1)) != 0) ||
    (((~address2 + 1) & (~address2)) != 0) ||
    ((~address3 + 1) & (~address3)) != 0))) {
  // Netmask is not valid!
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27667963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档