3

IPv4 と IPv6 の両方を使用して、デュアル スタック環境で IP アドレスの等価性をテストすることは可能ですか? もしそうなら、どのように?

私のアプリケーションは、Boost ASIO の上でwebsocket++を使用しています。

例として、私の LAN では、あるアプリケーションが でリッスンしている別のアプリケーションに接続します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 のみを使用する必要がありますか? 後で統合について心配するよりも、将来の機能を今すぐ含めたいと思います。

4

1 に答える 1

5

クラスip::tcp::addressoperator==.

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 および ipv6

于 2014-06-12T22:07:31.810 に答える