gpt4 book ai didi

c++ - IP 地址 v4/v6 等效性测试

转载 作者:太空狗 更新时间:2023-10-29 20:59:38 26 4
gpt4 key购买 nike

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

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

例如,在我的 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 吗?我宁愿现在就包含 future 的功能,也不愿担心以后的集成。

最佳答案

我认为您可以只使用 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

关于c++ - IP 地址 v4/v6 等效性测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24194631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com