boost :: asio :: ip :: tcp :: :: resolver risolvere () blocchi per sempre
-
21-08-2019 - |
Domanda
Sto cercando di creare qualcosa di simile come questo codice trovato gli esempi 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 ++ costruisce questo senza errori, ma il codice non lo rende passato la chiamata resolver.resolve ().
Ho provato sia "127.0.0.1" e "localhost" per host e "80" per la porta. (Non credo che dovrebbe avere importanza, ma apache2 è in servizio)
Quando ho CTRL + C dalla mia applicazione, termina ovviamente, ma lo fa in uscita la "Connessione a string" appena prima che lo fa.
Sto pensando di costruire l'esempio me stesso e vedere se si verifica lo stesso problema, e sicuramente dopo i risultati qui. Qualcuno ha incontrato questo problema o sa che cosa potrebbe causare questo comportamento?
modifica:
L'esempio viene eseguito bene ... ho qualche debug per fare suppongo.
secondo edit:
Io non capisco, l'unica cosa che potrebbe essere diverso è host / port.
Esempio utilizza char * argv [] e sto usando:
char host[] = "localhost";
char port[] = "80";
terzo edit:
sembra infatti essere il blocco alla connessione, dimenticato di fflush (stdout). allora deve essere un problema con la presa. andando a fare un po 'di più test.
quarto edit:
stupido me, non stava bloccando a tutti! Stavo solo fare troppo affidamento su uscita della console ..
Soluzione
E 'probabilmente bloccando sulla chiamata per collegare, dopo la printf.
stdout è la linea tamponato per default, e dal momento che non si dispone di un \ n alla fine della stringa printf, non vedrà la sua uscita. Quando uccidi il programma, il buffer viene lavata, motivo per cui si vede il messaggio di allora.