是否可以在使用IPv4和IPv6的双栈环境中测试IP地址的等效性?如果是这样,怎么样?
我的应用程序在Boost ASIO之上使用websocket++。
例如,在我的局域网上,一个应用程序连接到另一个应用程序192.168.1.2
,但使用this answer's IP address getter
std::string s = socket.remote_endpoint().address().to_string();
将::ffff:192.168.1.3
作为客户的地址。
问题是.2
将拥有自己的节点列表,其中包含.3
的原始v4地址,因此通过上面的getter与磁盘上保存的v4版本的简单字符串比较,它将寻求<{1}}的冗余连接,即使已连接。
我进一步了解到事情可能会变得更加复杂,因为dotted quad notation,.3
也是::ffff:192.0.2.128
。
我正在构建一个接受来自不受信任来源的地址的p2p应用程序,因此为了防止冗余连接,我需要能够绝对测试等效性。
我的意图可以实施吗?如果是这样,怎么样?如果没有,我应该只使用v4吗?我现在更愿意包括未来的功能,而不是担心以后的集成。
答案 0 :(得分:4)
我认为你可以使用ip::tcp::address
类&#39; operator==
。
#include <boost/asio.hpp>
using boost::asio::ip::address;
address from_string_ip6(std::string const& ip)
{
address a = address::from_string(ip);
if (a.is_v4())
return boost::asio::ip::address_v6::v4_mapped(a.to_v4());
else
return a;
}
int main()
{
address a = from_string_ip6("192.0.2.111");
address b = from_string_ip6("::ffff:192.0.2.111");
address c = from_string_ip6("::ffff:c000:026f");
assert(a == b);
assert(a == c);
assert(b == c);
}
更新如果要包含名称解析:ipv4 and ipv6 from any valid address