IP地址v4 / v6等价测试

时间:2014-06-12 22:03:13

标签: c++ boost-asio ip-address equivalence websocket++

是否可以在使用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吗?我现在更愿意包括未来的功能,而不是担心以后的集成。

1 个答案:

答案 0 :(得分:4)

我认为你可以使用ip::tcp::address类&#39; 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 and ipv6 from any valid address