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

1 ответ

Решение

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

Другие вопросы по тегам