telnet não solicita "Conexão fechada por host externo" quando a conexão é interrompida

2

Estou trabalhando com uma unidade Linux incorporada, eis minha situação:

Eu uso meu computador (máquina Ubuntu 16.04) para fazer o telnet em uma unidade que está emitindo o comando reboot , então a unidade reinicia com sucesso.

Aí vem o problema, espero que o telnet retorne e solicite Connection closed by foreign host. quando a unidade se desligar. Mas não a tempo, pelo contrário, ele solicita Connection closed by foreign host. somente após

  1. Eu pressionei a tecla de retorno do meu computador AND

  2. após / durante a inicialização da unidade

Quando faço a mesma coisa com outra unidade do meu computador, não há esse problema.

Por que isso? Isso é um problema de telnet, meu computador ou a unidade embutida? Como posso consertar isso?

    
por Henry 10.05.2018 / 20:49

2 respostas

2

O mais provável é que o sistema do seu cliente (aquele do qual você está executando o telnet) não tenha TCP Keepalive ativado globalmente (e provavelmente não deveria), e o sistema embarcado não está fechando a conexão normalmente.

Este é um problema comum com serviços de rede que geram processos separados para cada sessão de usuário, e não os terminam quando o processo principal é encerrado (no outro lado da moeda, você pode reiniciar o serviço para uma atualização sem afetar os usuários conectados, e é por isso que eles fazem isso em primeiro lugar).

    
por 10.05.2018 / 21:14
1

Você pode ativar o keepalive apenas para sua conexão telnet aplicando algumas opções no soquete. Em vez de codificar isso e recompilar o programa, você pode simplesmente usar uma biblioteca existente libkeepalive .

Faça o download do arquivo tar de origem, libkeepalive-0.3.tar.gz , e compile a biblioteca com o comando make .

tar xvzf libkeepalive-0.3.tar.gz
cd libkeepalive-0.3
make

Você terá um arquivo libkeepalive.so . Agora você pode executar seu telnet com a biblioteca pré-carregada. Ele fará as alterações apropriadas na função socket() . Você tem 3 valores que você pode definir no ambiente, como para o keepalive global. Por exemplo,

LD_PRELOAD=$PWD/libkeepalive.so \
 KEEPCNT=2 KEEPIDLE=2 KEEPINTVL=4 telnet hostname

Agora, quando o controle remoto parar de responder aos pacotes keepalive, o comando telnet sairá com Connection closed by foreign host.

Veja o arquivo README nas fontes:

KEEPCNT     <=>   net.ipv4.tcp_keepalive_probes
KEEPIDLE    <=>   net.ipv4.tcp_keepalive_time
KEEPINTVL   <=>   net.ipv4.tcp_keepalive_intvl

Após KEEPIDLE segundos, um pacote keepalive será enviado a cada KEEPINTVL segundos. Após os pacotes KEEPCNT sem resposta, desconecte-se.

    
por 10.05.2018 / 22:10

Tags