3 c++ ip-address equivalence boost-asio websocket++
是否可以在同时使用 IPv4 和 IPv6 的双栈环境中测试 IP 地址的等效性?如果是这样,如何?
我的应用程序在 Boost ASIO 之上使用websocket++。
例如,在我的 LAN 上,一个应用程序连接到另一个侦听192.168.1.2,但使用此答案的 IP 地址获取器
std::string s = socket.remote_endpoint().address().to_string();
Run Code Online (Sandbox Code Playgroud)
给::ffff:192.168.1.3作为客户的地址。
问题是.2它将拥有自己的节点列表,其中包含原始 v4 地址 for .3,因此通过上面的 getter 与磁盘上保存的 v4 版本的简单字符串比较,.3即使已经连接,它也会寻找冗余连接。
我进一步读到事情可能会变得更加复杂,因为通过这个点分四元表示法,::ffff:192.0.2.128也是::ffff:c000:0280.
我正在构建一个接受来自不受信任来源的地址的 p2p 应用程序,因此为了防止冗余连接,我需要能够绝对测试等效性。
我的意图可以实现吗?如果是这样,如何?如果没有,我应该只使用 v4 吗?我宁愿现在就包含未来的功能,而不是担心以后的集成。
我认为你可以只使用ip::tcp::address类' operator==.
#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);
}
Run Code Online (Sandbox Code Playgroud)
更新如果要包括名称解析:来自任何有效地址的 ipv4 和 ipv6