저는 임베디드 Linux 장치를 사용하고 있으며 이것이 제 상황입니다:
내 컴퓨터(Ubuntu 16.04 시스템)를 사용하여 reboot
명령을 실행한 장치에 텔넷으로 연결했고 장치가 성공적으로 재부팅되었습니다.
문제는 Connection closed by foreign host.
장치가 자동으로 종료될 때 텔넷이 다시 돌아와서 메시지를 표시하도록 하려는 것입니다. 하지만 시간이 맞지 않아서 오히려Connection closed by foreign host.
이후에만 메시지가 표시됩니다 .
내 컴퓨터에서 Enter 키를 누릅니다. 그리고
장치 시작 후/중
내 컴퓨터에서 다른 장치에 동일한 작업을 수행할 때 이러한 문제는 없습니다.
왜 그런 겁니까? 이것이 텔넷, 내 컴퓨터 또는 내장 장치에 문제가 있습니까? 어떻게 해결할 수 있나요?
답변1
대부분의 경우 클라이언트 시스템(텔넷을 실행 중인 시스템)에 TCP keepalive가 전역적으로 활성화되어 있지 않으며(아마도 활성화되어서는 안 됨) 임베디드 시스템이 연결을 정상적으로 종료하지 않습니다.
이는 각 사용자 세션에 대해 별도의 프로세스를 생성한 다음 기본 프로세스가 종료될 때 이를 종료하지 않는 네트워크 서비스의 일반적인 문제입니다(그러나 반면에 서비스를 다시 시작하여 연결된 사용자에게 영향을 주지 않고 업그레이드할 수 있습니다. 이것이 그들이 처음에 그렇게 한 이유입니다).
답변2
소켓에 일부 옵션을 적용하여 텔넷 연결에 대해서만 연결 유지를 활성화할 수 있습니다. 프로그램을 코딩하고 다시 컴파일하는 대신 기존 라이브러리를 간단히 사용할 수 있습니다.libkeepalive.
소스 tar 파일을 다운로드 libkeepalive-0.3.tar.gz
하고 명령을 사용하여 라이브러리를 컴파일합니다 make
.
tar xvzf libkeepalive-0.3.tar.gz
cd libkeepalive-0.3
make
파일이 있을 것입니다 libkeepalive.so
. 이제 사전 로드된 라이브러리를 사용하여 텔넷을 실행할 수 있습니다. 그러면 socket()
기능이 적절하게 변경됩니다. 전역 Keepalive 등 사용자 환경에서 설정할 수 있는 값은 3가지입니다. 예를 들어,
LD_PRELOAD=$PWD/libkeepalive.so \
KEEPCNT=2 KEEPIDLE=2 KEEPINTVL=4 telnet hostname
이제 원격 장치가 keepalive 패킷에 대한 응답을 중지하면 telnet 명령이 다음과 같이 종료됩니다.Connection closed by foreign host.
README
소스의 파일을 확인하세요 .
KEEPCNT <=> net.ipv4.tcp_keepalive_probes
KEEPIDLE <=> net.ipv4.tcp_keepalive_time
KEEPINTVL <=> net.ipv4.tcp_keepalive_intvl
KEEPIDLE 초 후에는 KEEPINTVL 초마다 연결 유지 패킷이 전송됩니다. KEEPCNT KEEPCNT 데이터 패킷에 대한 응답이 없으면 연결이 끊어집니다.