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 ..

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top