IP地址v4/v6等价性测试



是否有可能在使用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

最新更新