私のアプリはlibssh2を使用してSSH経由で通信し、通常は正常に動作します。私が抱えている問題の1つは、リモートホストが予期せず停止した場合です。この場合のリモートホストは、いつでも電力を失う可能性のある組み込みデバイスであるため、これは珍しいことではありません。
その場合、私のアプリはリモートコンピューターがpingへの応答を停止したことを検出し、次のようにSSH接続のローカルエンドを切断します。
void SSHSession :: CleanupSession()
{
if (_uploadFileChannel)
{
libssh2_channel_free(_uploadFileChannel);
_uploadFileChannel = NULL;
}
if (_sendCommandsChannel)
{
libssh2_channel_free(_sendCommandsChannel);
_sendCommandsChannel = NULL;
}
if (_session)
{
libssh2_session_disconnect(_session, "bye bye");
libssh2_session_free(_session);
_session = NULL;
}
}
非常に簡単ですが、問題は、libssh2_channel_free()呼び出しが、リモートエンドが「I'mgoing away now」メッセージに応答するのを長時間ブロックする可能性があることです。これは、電源がオフになっているため、決して実行されません...しかし、その間、私のアプリはフリーズします(クリーンアップルーチンでブロックされます)。これは良くありません。
これを回避する方法(libssh2をハッキングする以外)はありますか?ローカルSSHデータ構造を破棄し、この破棄中にブロックしないようにしたいと思います。(SSHセッションメモリを単にリークするか、別のスレッドに委任することができると思いますが、それらは適切な解決策ではなく、醜いハックのようです)