Tengo un reproductor en lata invocando boost::asio::ip::tcp::resolver::resolve()
en localhost
una vez cada 5 segundos. Cuenta el número de puntos finales devueltos y compara ese valor con la iteración anterior.resultados de Boost.Asio resolver differ
#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);
}
}
sesión de ejemplo
~> 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
~>
Se puede ver que encontró un punto final (127.0.0.1:80) durante aproximadamente 3,5 horas, luego encontró dos (127.0.0.1:80 y [:: 1] : 80). Me pregunto
- ¿por qué el conteo de puntos finales cambia de uno a dos?
- ¿qué podría causarlo?
Resolviendo las direcciones ipv4 e ipv6 es intencional, no quiero limitar la consulta a solo ipv4. Me doy cuenta de que este comportamiento probablemente no es específico de asio, también tengo un reproductor que invoca directamente al getaddrinfo
que muestra el mismo comportamiento. Mi plataforma es ppc64 RHEL 6.2 si eso es relevante. No he intentado reproducir en otro lugar.
La dirección ':: 1' es la dirección del host local IPv6. Tal vez el sistema operativo tarda tanto tiempo en darse cuenta de que tiene habilitado IPv6. –
¿Cuál es el sistema operativo en el que se está ejecutando? – gda2004
@ gda2004 ver la última oración de la pregunta, ppc64 RHEL 6.2 –