【问题标题】:IP address v4/v6 equivalence testingIP 地址 v4/v6 等效测试
【发布时间】:2014-06-12 22:03:12
【问题描述】:

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

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

例如,在我的 LAN 上,一个应用程序连接到另一个侦听 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 版本,它将寻找冗余连接到.3 即使已经连接。

我进一步了解到事情会变得更复杂,因为dotted quad notation::ffff:192.0.2.128 也是 ::ffff:c000:0280

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

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

【问题讨论】:

  • 你想限制协议吗?

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


【解决方案1】:

我认为您可以只使用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 and ipv6 from any valid address

【讨论】:

  • 整个诀窍是按预期简单地使用类(封装领域知识) - 根本不关心字符串表示。过上幸福的生活,喝杯啤酒(与 boost 开发者分享!)
  • 我不是 boost 开发者。你需要公钥做什么? AAAAC3NzaC1lZDI1NTE5AAAAIHOn6tEWqduGI076kYoo32EwRT6oCHbJtzS34Z0x4Vi2(到那时,你可以看出我不使用 BSD)
  • 您需要将所有地址标准化为 IPv6 地址才能执行此操作。通过 Asio/WebSocket++ 传入的地址应该已经被规范化了。如果您需要比较 raw IPv4 地址,您应该使用上面演示的 from_string 构造函数,然后使用 boost ip::address_v6::v4_mapped 函数转换为 IPv4 映射格式。 (boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/…)
  • @Gracchus 早上好 :) 好电话。这就是 zaphoyd 的意思:Live On Coliru(而且,你发现了我不知道/意识到的事情:))
猜你喜欢
  • 1970-01-01
  • 2012-03-03
  • 2023-04-10
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多