代码之家  ›  专栏  ›  技术社区  ›  user1553248

比较两个IPv6地址及其掩码(窗口)

  •  1
  • user1553248  · 技术社区  · 14 年前

    我必须比较两个IPv6地址和它们的掩码,看看它们是否相同。它们都是字符串形式,例如“xxxx:xxxx:XXXXX/xx”。我只想使用memcmp一点一点地比较它们,但如果为true,则可能返回false,因为xxxx:xxxx:0000:xxxx/xx和xxxx:xxxxx::xxxxx/xx在技术上是相同的地址。

    我不想创建地址和掩码的子字符串,但若有一个函数可以比较两个IPv6地址,我会的。有什么建议吗?:)

    4 回复  |  直到 13 年前
        1
  •  5
  •   Celada    14 年前

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

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

    1. 找到斜线
    2. 将斜线之前的部分传递给 inet_吨
    3. 用纯ol分析斜杠后的整数 atoi
    4. 手动将128减去地址二进制形式末尾的位数清零

    …在每个地址上,然后进行比较。

        2
  •  1
  •   bortzmeyer    13 年前

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

        3
  •  0
  •   sebo    14 年前

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

        4
  •  0
  •   Ivan Kruglov    14 年前

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

    函数示例:

    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));
    }
    
    推荐文章