我必须比较两个 IPv6 地址和它们的掩码,看看它们是否相同。它们都在字符串中,例如“xxxx:xxxx:xxxx:xxxx/xx”。我只会使用 memcmp 逐位比较它们,但是这可能会在 true 时返回 false,因为 xxxx:xxxx:0000:xxxx/xx 和 xxxx:xxxxx::xxxxx/xx 在技术上是相同的地址。
我不希望创建地址和掩码的子字符串,但如果有一个比较两个 IPv6 地址的函数,我会这样做。有什么建议么?:)
我必须比较两个 IPv6 地址和它们的掩码,看看它们是否相同。它们都在字符串中,例如“xxxx:xxxx:xxxx:xxxx/xx”。我只会使用 memcmp 逐位比较它们,但是这可能会在 true 时返回 false,因为 xxxx:xxxx:0000:xxxx/xx 和 xxxx:xxxxx::xxxxx/xx 在技术上是相同的地址。
我不希望创建地址和掩码的子字符串,但如果有一个比较两个 IPv6 地址的函数,我会这样做。有什么建议么?:)
您应该使用将两者转换为二进制形式inet_pton
,然后比较二进制形式(您可以比较的只是 16 个字节的数据memcmp
)。
如果您需要比较屏蔽地址,那么您将不得不做更多的工作。inet_pton
不会为您解析前缀长度(“/something”),因此您必须:
inet_pton
atoi
...在比较它们之前在每个地址上。
像往常一样,不要重新发明轮子。出色的 libcidr 库可以满足您的需求,甚至更多。 http://www.over-yonder.net/~fullermd/projects/libcidr
我仍然建议使用子字符串,因为它们很容易提取。然后,您可以重载字符串的 equals() 函数以在比较“0000”和“”以及您可能遇到的任何其他极端情况时返回 true。
您还可以通过将它们转换为相同格式的函数传递这两个地址。之后,您可以将它们作为字符串进行比较。
函数示例:
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));
}