私は組み込みLinuxデバイスを使用しており、これが私の状況です:
マイコンピュータ(Ubuntu 16.04システム)を使用してreboot
コマンドを実行したデバイスにTelnetで接続し、デバイスが正常に再起動しました。
問題は、Connection closed by foreign host.
デバイスが自動的にシャットダウンしたときにTelnetに戻ってメッセージを表示させることです。しかし時間が合わなかったので、むしろConnection closed by foreign host.
その後のみメッセージが表示されます。
マイコンピュータでEnterキーを押します。 そして
デバイス起動後/中
マイ コンピューターで別のデバイスで同じ操作を実行する場合、これらの問題はありません。
なぜそんなことですか?これはTelnet、マイコンピュータ、または内蔵デバイスに問題がありますか?どうすれば解決できますか?
答え1
ほとんどの場合、クライアントシステム(Telnetを実行しているシステム)でTCPキープアライブがグローバルに有効になっていない(おそらく有効にしてはいけません)、組み込みシステムは正常に接続を終了しません。
これは、各ユーザーセッションごとに別々のプロセスを作成し、メインプロセスが終了したときに終了しないネットワークサービスの一般的な問題ですが、サービスを再起動して接続ユーザーに影響を与えることなくアップグレードできます。これが彼らが最初にそうした理由です)。
答え2
ソケットにいくつかのオプションを適用して、Telnet接続に対してのみ接続維持を有効にできます。プログラムをコーディングして再コンパイルする代わりに、既存のライブラリを簡単に使用できます。libkeepalive。
ソースtarファイルをダウンロードlibkeepalive-0.3.tar.gz
し、コマンドを使用してライブラリをコンパイルしますmake
。
tar xvzf libkeepalive-0.3.tar.gz
cd libkeepalive-0.3
make
ファイルがありますlibkeepalive.so
。これで、プリロードされたライブラリを使用してTelnetを実行できるようになりました。これにより、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 データパケットへの応答がない場合、接続は切断されます。