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

Foi útil?

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.

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