boost :: asio :: :: ip tcp :: :: resolver determinación () bloquea para siempre
-
21-08-2019 - |
Pregunta
Estoy tratando de crear algo similar a este código encontrar en los ejemplos boost.asio.
socket.h:
class some_class {
private:
...
boost::asio::io_service io_service;
public:
some_class() {
/* This stuff isn't used in the example...
...but it doesn't change anything... */
io_service.run();
}
};
socket.cpp:
using boost::asio::ip::tcp;
bool some_class::connect(char* host, char* port)
{
printf("Resolving hostname...\n");
/* Resolve hostname. */
tcp::resolver resolver(io_service);
tcp::resolver::query query(tcp::v4(), host, port);
tcp::resolver::iterator iterator = resolver.resolve(query);
printf("Connecting to %s:%s... ", host, port);
/* Connect to resolved hosts. */
sock->connect(*iterator);
return true;
}
g ++ construye esto sin ningún error, pero el código no hace más allá de la llamada resolver.resolve ().
He intentado tanto "127.0.0.1" y "localhost" para el host y "80" para el puerto. (No creo que debería importar, pero apache2 está en funcionamiento)
Cuando Ctrl + C de mi solicitud, es obvio que termina pero sí la salida de "Conexión a cadena" justo antes de que lo hace.
Estoy pensando en construir el ejemplo a mí mismo y ver si se produce el mismo problema, y, sin duda publicar los resultados aquí. ¿Alguien ha encontrado este problema o sabe lo que podría causar este comportamiento?
editar:
El ejemplo se ejecuta muy bien ... tengo algo de depuración que hacer, supongo.
segunda edición:
Yo no lo entiendo, la única cosa que podría ser diferente es host / puerto.
Ejemplos de uso char * argv [] y estoy usando:
char host[] = "localhost";
char port[] = "80";
tercera edición:
De hecho, parece ser el bloqueo en conexión, se olvidó de fflush (stdout). entonces tiene que haber un problema con la toma de corriente. vamos a hacer algunas pruebas más.
cuarta edición:
estúpida de mí, no estaba bloqueando a todos! Estaba depender demasiado de la salida de la consola ..
Solución
Se bloqueando probablemente en la llamada para conectar, después de que el printf.
stdoutes búfer de línea por defecto, y ya que no tiene un \ n al final de la cadena de printf, no verá su salida. Cuando se mata el programa, se tiró de la memoria intermedia, por lo que ve el mensaje a continuación.