是否有可能在使用IPv4和IPv6的双堆栈环境中测试IP地址的等效性?如果有,怎么做?
我的应用程序在Boost ASIO之上使用websocket++。
作为一个例子,在我的局域网中,一个应用程序连接到另一个监听192.168.1.2
,但使用这个答案的IP地址getter
std::string s = socket.remote_endpoint().address().to_string();
给出::ffff:192.168.1.3
作为客户端的地址。
问题是.2
将有自己的节点列表与.3
的原始v4地址,所以通过简单的字符串比较上面的getter与磁盘上保存的v4版本,它将寻求一个冗余连接到.3
,即使已经连接。
我进一步读到,事情可能会变得更复杂,因为这个点四分符号,::ffff:192.0.2.128
也是::ffff:c000:0280
。
我正在构建一个接受来自不可信来源的地址的p2p应用程序,因此为了防止冗余连接,我需要能够绝对测试等效性。
我的意图可以实现吗?如果有,怎么做?如果不是,我应该只使用v4吗?我更愿意现在就包含未来的功能,而不是担心以后的集成。
我认为你可以直接使用ip::tcp::address
类的operator==
。
查看Live On Coliru
#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和ipv6