3

是否可以在同时使用 IPv4 和 IPv6 的双栈环境中测试 IP 地址的等效性?如果是这样,怎么做?

我的应用程序在 Boost ASIO 之上使用websocket++ 。

例如,在我的 LAN 上,一个应用程序连接到另一个正在侦听的应用程序192.168.1.2,但使用此答案的 IP 地址获取器

std::string s = socket.remote_endpoint().address().to_string();

给出::ffff:192.168.1.3作为客户的地址。

问题是.2它将有自己的节点列表和原始 v4 地址,因此通过简单的字符串比较上面的 getter 与磁盘上保存的 v4 版本,即使已经连接.3,它也会寻找冗余连接。.3

我进一步读到,事情可能会变得更复杂,因为通过这种虚线四边形表示法::ffff:192.0.2.128也是::ffff:c000:0280

我正在构建一个 p2p 应用程序,该应用程序接受来自不受信任来源的地址,因此为了防止冗余连接,我需要能够绝对测试等效性。

我的意图可以实现吗?如果是这样,怎么做?如果没有,我应该只使用 v4 吗?我宁愿现在就包含未来的功能,而不是担心以后的集成。

4

1 回答 1

5

我认为你可以只使用ip::tcp::address类' operator==.

在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

于 2014-06-12T22:07:31.810 回答