Impulsionar asio ip tcp iostream Detecção de erro
-
22-07-2019 - |
Pergunta
Saudações. Eu estou apenas começando com o boost :: asio biblioteca e ter executado em alguma dificuldade no início relacionado com boost :: asio :: ip :: tcp :: iostream.
A minha pergunta tem duas partes:
1.) Como se conectar um iostream usando simplesmente host e número da porta?
Eu posso fazer o href="http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/example/iostreams/daytime_client.cpp" rel="nofollow noreferrer"> cliente e servidor belo trabalho [boost.org] como exemplos codificada. O servidor especifica a porta explicitamente:
boost::asio::io_service io_service;
tcp::endpoint endpoint(tcp::v4(), 13);
tcp::acceptor acceptor(io_service, endpoint);
Port 13 é uma porta bem conhecida por um serviço de "dia".
O exemplo cliente se conecta, especificando um host e o nome do serviço:
tcp::iostream s(argv[1], "daytime");
Para a minha própria aplicação, eu gostaria de colocar o servidor em uma porta arbitrária e se conectar por número como mostrado abaixo:
Servidor:
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, no cliente, eu tento especificar o número da porta directamente (em vez de um serviço pelo nome), o fluxo não consegue se conectar. Existe uma maneira de fazer isso? Não está claro para mim o que os argumentos para conectar poderia / deveria ser.
2.) O que é a forma preferida para testar o sucesso de uma chamada para iostream :: connect?
A função retorna void, e nenhuma exceção é lançada. O único método que eu inventou até agora é testar a stream.fail () e / ou stream.good (). É este o caminho para fazê-lo, ou se há algum outro método.
Conselhos sobre um ou ambos destes seria apreciada. Além disso, se eu estou com vista para documentação e / ou exemplos pertinentes aqueles seria bom. Até agora eu não tenho sido capaz de responder a estas questões, lendo os documentos da biblioteca ou pesquisar na net'.
Solução
Eu não sei por que ASIO não funciona (pelo menos com impulso 1.35.0) com um número de porta expressa como um int. Mas, você pode especificar o número da porta como uma string. i.
tcp::iostream s(hostname, "13");
deve funcionar.
sobre a detecção de erros:
tcp::socket
tem um método connect () que leva e endpoint e uma referência a um objeto boost::system::error_code
que lhe dirá se conectado com êxito.
Outras dicas
Mesmo que nenhum erro é retornado, stream.error () contém o último código de erro. Eu usei o código
do
{
m_stream.clear();
m_stream.connect(host, port);
}
while(m_stream.error());`
Você também poderia verificar apenas para o impulso de erro específica :: asio :: erro :: connection_refused.