Можно ли проверить IP-адреса на эквивалентность в среде с двумя стеками, используя как IPv4, так и IPv6? Если так, то как?
Мое приложение использует WebSocket ++ поверх Boost ASIO.
Например, в моей локальной сети одно приложение подключается к другому, прослушивая 192.168.1.2
, но используя получатель IP-адреса этого ответа
std::string s = socket.remote_endpoint().address().to_string();
дает ::ffff:192.168.1.3
как адрес клиента.
Проблема в том, что .2
будет иметь свой собственный список узлов с исходным адресом v4 для .3
Таким образом, при простом сравнении строк получателя выше с версией 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);
}
Обновить Если вы хотите включить разрешение имен: ipv4 и ipv6 с любого действительного адреса