Como verificar se o socket está fechado em Boost.Asio?
-
03-07-2019 - |
Pergunta
O que é a maneira mais fácil de verificar se um socket foi fechado no lado remoto da conexão? socket::is_open()
retorna verdadeiro mesmo se estiver fechado no lado remoto (estou usando boost::asio::ip::tcp::socket
).
Eu poderia tentar ler a partir do fluxo e ver se ele tiver êxito, mas eu teria que mudar a lógica do meu programa para que ele funcione desta maneira (Eu não quero que os dados sejam extraídos do fluxo no ponto do cheque).
Solução
Se a conexão foi corretamente fechada pelo peer você deve obter um EOF ao ler. Caso contrário, eu geralmente de ping, a fim de descobrir se a conexão está realmente vivo.
Outras dicas
Basta verificar para erro boost::asio::error::eof
no seu manipulador async_receive
. Isso significa que a ligação tenha sido fechada. Essa é a única maneira correta de fazer isso.
Existe uma função espiada impulso disponíveis? A maioria das implementações de soquete tem uma maneira de ler os dados sem removê-lo da fila, para que você possa lê-lo novamente mais tarde. Isto parece satisfazer suas necessidades.
Depois de rapidamente olhando através dos docs ASIO, eu não era capaz de encontrar exatamente o que eu estava esperando, mas isso não significa que a sua não existe.
Eu sugiro este para começar.
Eu acho que, em geral, uma vez que você abrir um soquete, você deve começar a lê-lo de forma imediata e nunca parar de fazer isso. Desta forma, você pode fazer o seu servidor ou cliente para suportar os dois protocolos síncronos e assíncronos. No momento em que o cliente fecha a conexão, o momento em que a leitura vai lhe dizer isso.
Usando código_erro é capaz de verificar a condição se o cliente está conectado ou não. Se a conexão é sucesso, o error.value código_erro () irá retornar 0, senão retorna outro valor. Você também pode verificar a mensagem () da código_erro.