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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top