Potenzia il rilevamento errori iostream di asio ip tcp
-
22-07-2019 - |
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.
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.