Тестирование эквивалентности IP-адреса v4 / v6

Можно ли проверить 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? Я бы предпочел включить будущие возможности сейчас, а не беспокоиться об интеграции позже.

3

Решение

Я думаю, что вы можете просто использовать 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 с любого действительного адреса

4

Другие решения


По вопросам рекламы [email protected]