6

私は5秒ごとに1回boost::asio::ip::tcp::resolver::resolve()起動する缶詰の再生器を持っています。localhost返されたエンドポイントの数をカウントし、その値を前の反復と比較します。

#include <boost/asio.hpp>

#include <iostream>

int main(int argc, char *argv[])
{
    if ( argc < 3 ) {
        std::cerr << argv[0] << " host port" << std::endl;
        exit( EXIT_FAILURE );
    }
    const char* host = argv[1];
    const char* service = argv[2];

    boost::asio::io_service io_service;
    boost::asio::ip::tcp::resolver resolver( io_service );

    size_t previous = 0;
    while ( true ) {
        boost::asio::ip::tcp::resolver::iterator i(
                resolver.resolve(
                    boost::asio::ip::tcp::resolver::query( host, service )
                    )
                );
        size_t count( 0 );
        while ( i != boost::asio::ip::tcp::resolver::iterator() ) {
            std::cout << i->endpoint() << std::endl;
            ++i;
            ++count;
        }

        std::cout << "got " << count << " addresses" << std::endl;
        if ( previous == 0 ) {
            previous = count;
        }
        assert( count == previous );

        sleep( 5 );
    }
}

サンプルセッション

~> time ./addrinfo_asio localhost 80

...

127.0.0.1:80
got 1 addresses
[::1]:80
127.0.0.1:80
got 2 addresses
addrinfo_asio: addrinfo_asio.cc:35: int main(int, char**): Assertion `count == previous' failed.
Aborted (core dumped)

real    216m20.515s
user    0m0.181s
sys     0m0.193s
~> 

約 3.5 時間で 1 つのエンドポイント (127.0.0.1:80) が検出され、その後 2 つのエンドポイント (127.0.0.1:80 および [::1]:80) が検出されたことがわかります。不思議なんだけど

  1. エンドポイント数が 1 から 2 に変わるのはなぜですか?
  2. 何が原因でしょうか?

ipv4 と ipv6 の両方のアドレスを解決することは意図的なものです。クエリを ipv4 だけに制限したくありません。この動作はasioに固有のものではない可能性が高いことを認識していgetaddrinfoます。同じ動作を示す直接呼び出しを行うリピーターもあります。関連する場合、私のプラットフォームは ppc64 RHEL 6.2 です。他での再現は試していません。

4

3 に答える 3

3

リゾルバーはIPv4のみに制限できます:
ip :: tcp :: resolver :: query(ip :: tcp :: v4()、host、service)

于 2012-06-12T06:36:35.137 に答える
1

私はブーストの専門家ではありませんが、すばやく参照するとAI_ADDRCONFIG、デフォルトで使用されているように見えます(これは良いことですが、ほとんどの場合使用する必要があります)。このフラグを使用すると、少なくとも1つのグローバルルーティング可能なIPv6アドレスが構成されている場合にのみIPv6アドレスが返されます。おそらく、IPv6接続が常に利用できるとは限りませんか?

于 2012-07-09T22:28:39.853 に答える