1

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

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

4

4 回答 4

5

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

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

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

...在比较它们之前在每个地址上。

于 2012-07-31T00:40:07.070 回答
1

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

于 2013-06-15T21:21:36.450 回答
0

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

于 2012-07-31T00:55:10.907 回答
0

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

函数示例:

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));
}
于 2012-07-31T01:02:11.320 回答