【问题标题】:Comparing two IPv6 addresses and their masks (windows)比较两个 IPv6 地址及其掩码(窗口)
【发布时间】:2012-07-28 16:59:58
【问题描述】:

我必须比较两个 IPv6 地址和它们的掩码,看看它们是否相同。它们都在字符串中,例如“xxxx:xxxx:xxxx:xxxx/xx”。我只会使用 memcmp 逐位比较它们,但是这可能会在 true 时返回 false,因为 xxxx:xxxx:0000:xxxx/xx 和 xxxx:xxxxx::xxxxx/xx 在技术上是相同的地址。

我不希望创建地址和掩码的子字符串,但如果有一个比较两个 IPv6 地址的函数,我会这样做。有什么建议? :)

【问题讨论】:

    标签: c++ ip-address equals ipv6 mask


    【解决方案1】:

    您应该使用inet_pton 将这两个地址都转换为二进制形式,然后比较二进制形式(您可以与memcmp 进行比较的只有16 个字节的数据)。

    如果您需要比较屏蔽地址,那么您将需要做更多的工作。 inet_pton 不会为您解析前缀长度(“/something”),因此您必须:

    1. 找到斜线
    2. 将斜线前的部分传递给inet_pton
    3. 用普通的 ol' atoi 解析斜线后面的整数
    4. 手动清零 128 减去二进制形式地址末尾的位数

    ...在比较每个地址之前。

    【讨论】:

    • 谢谢!我想我会采用这种方法。
    • @user1553248:提示:如果您使用此解决方案,则将答案标记为已接受;-) 请参阅meta.stackexchange.com/questions/5234/…
    • 为什么需要第四步?一旦我有了二进制形式的地址,我不应该已经能够调用 memcmp 来测试它们是否相等吗?
    • 在您的问题中,您暗示您想在匹配中考虑前缀长度,例如 ::1234:5678:9abc/128 和 ::1234:5678:def0/128 将不相等(比较所有 128 位)而 ::1234:5678:9abc/112 和 ::1234:5678:def0/112 将相等(由于 /112 前缀长度,最后 16 位不计算在内)。为此,您必须将不计数的位清零。
    • 第四步怎么做?不能在 in6_addr 上做位移?
    【解决方案2】:

    我仍然建议使用子字符串,因为它们很容易提取。然后,您可以重载字符串的 equals() 函数以在比较“0000”和“”以及您可能遇到的任何其他极端情况时返回 true。

    【讨论】:

    • 方式的情况太多,这不是一个可行的选择:0、00、000 和 0000 都相等,::折叠任意数量的 16 位零位组,并且它在每个地址中的位置可能不同,有大写和小写十六进制数字,地址如 ::ffff:1.2.3.4 与 ::ffff:102:304 相同,等等。
    【解决方案3】:

    您还可以通过将它们转换为相同格式的函数传递这两个地址。之后,您可以将它们作为字符串进行比较。

    函数示例:

    string Ip6(const string& data) {
        struct in6_addr ip6;
        if (inet_pton(AF_INET6, data.c_str(), &ip6) != 1)
            throw str::runtime_error("bad ivp6 address");
    
        char buf[INET6_ADDRSTRLEN];
        return inet_ntop(AF_INET6, &ip6, buf, sizeof(buf));
    }
    

    【讨论】:

      【解决方案4】:

      像往常一样,不要重新发明轮子。出色的 libcidr 库可以满足您的需求,甚至更多。 http://www.over-yonder.net/~fullermd/projects/libcidr

      【讨论】:

      • 酷!不知何故,任何搜索引擎的搜索量都没有将我指向 libcidr!!,感谢您提供参考。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 2013-05-13
      • 1970-01-01
      • 2012-02-08
      • 2012-12-04
      相关资源
      最近更新 更多