Boost.Asio解析器的结果不同

Sam*_*ler 6 c++ sockets boost boost-asio getaddrinfo

我有一个罐装再生器boost::asio::ip::tcp::resolver::resolve(),localhost每5秒钟调用一次.它计算返回的端点数,并将该值与上一次迭代进行比较.

#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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

样本会议

~> 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
~> 
Run Code Online (Sandbox Code Playgroud)

您可以看到它找到一个端点(127.0.0.1:80)约3.5小时,然后找到两个(127.0.0.1:80和[:: 1]:80).我在想

  1. 为什么端点数从1变为2?
  2. 什么可能导致它?

解析ipv4和ipv6地址都是故意的,我不想将查询限制为只是ipv4.我意识到这种行为可能不是特定于asio,我还有一个getaddrinfo直接调用的再现器,它表现出相同的行为.如果相关,我的平台是ppc64 RHEL 6.2.我没有尝试在别处复制.

Igo*_* R. 3

您可以将解析器限制为仅 IPv4:
ip::tcp::resolver::query(ip::tcp::v4(), host, service)