Domanda

Saluti. Ho appena iniziato con la libreria boost :: asio e ho incontrato alcune difficoltà iniziali legate a boost :: asio :: ip :: tcp :: iostream.

La mia domanda ha due parti:

1.) Come si collega un iostream usando semplicemente l'host e il numero di porta?

Posso creare il client e server [boost.org] esempi funzionano bene come codificati. Il server specifica esplicitamente la porta:

boost::asio::io_service io_service;

tcp::endpoint endpoint(tcp::v4(), 13);
tcp::acceptor acceptor(io_service, endpoint);

La porta 13 è una porta ben nota per un "giorno" " servizio.

L'esempio client si collega specificando un host e il nome del servizio:

tcp::iostream s(argv[1], "daytime");

Per la mia applicazione, vorrei mettere il server su una porta arbitraria e collegarmi per numero come mostrato di seguito:

Server:

boost::asio::io_service io_service;
tcp::endpoint endpoint(tcp::v4(), port);
tcp::acceptor acceptor(io_service, endpoint);
acceptor.accept(*this->socketStream.rdbuf());
...

Cliente:

boost::asio::ip::tcp::iostream sockStream;
...
sockStream.connect("localhost", port);
...

Se, nel client, provo a specificare direttamente il numero di porta (anziché un servizio per nome), lo stream non riesce a connettersi. C'è un modo per fare questo? Non mi è chiaro quali potrebbero essere / dovrebbero essere gli argomenti da connettere.


2.) Qual è il modo preferito per testare il successo di una chiamata a iostream :: connect?

La funzione restituisce nulla e non viene generata alcuna eccezione. L'unico metodo che ho escogitato finora è testare stream.fail () e / o stream.good (). È questo il modo di farlo o c'è qualche altro metodo.


Sarebbe gradito un consiglio su uno o entrambi. Inoltre, se trascuro la documentazione pertinente e / o gli esempi, sarebbe bello. Finora non sono stato in grado di rispondere a queste domande leggendo i documenti della biblioteca o cercando nella 'rete.

È stato utile?

Soluzione

Non so perché asio non funziona (almeno con Boost 1.35.0) con un numero di porta espresso come int. Tuttavia, è possibile specificare il numero di porta come stringa. cioè.

tcp::iostream s(hostname, "13");

dovrebbe funzionare.

relativo al rilevamento degli errori:

tcp :: socket ha un metodo connect () che accetta e endpoint e un riferimento a un oggetto boost :: system :: error_code che ti dirà se collegato correttamente.

Altri suggerimenti

Anche se non viene restituito alcun errore, stream.error () contiene l'ultimo codice di errore. Ho usato il codice

do
{
    m_stream.clear();
    m_stream.connect(host, port);
}
while(m_stream.error());`

Potresti anche verificare solo l'errore specifico boost :: asio :: error :: connection_refused.

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