2

libssh2 を使用して「最初にデータを取得したチャネルからデータを読み取る」プリミティブを実装するための推奨される方法は何ですか? たとえば、各タブが LIBSSH2 チャネルに対応する単純な 2 つのタブを持つ端末プログラムがあります。2つのチャネルのいずれかがデータを取得してから印刷するまで待ちたいと思います。

単一チャネルの例では、次のようにブロックしない方法で libssh2_channel_read() を使用します。

while(not done) {
    1.  Try reading with libssh2_channel_read()
    2.  If returned LIBSSH2_ERROR_EAGAIN, wait with select()
}

これを 2 チャンネルのケースに拡張する簡単な方法は次のとおりです。

while(not done) {
    1.  Try reading channel 1
    2.  Try reading channel 2
    3.  If BOTH channels returned LIBSSH2_ERROR_EAGAIN, wait with select()
}

これにより、チャネル 1 のデータを含むパケットがチャネル 2 を読み取る直前に到着したときに、まれにバグが発生します。その後、両方の呼び出しで LIBSSH2_ERROR_EAGAIN が返されますが、チャネル 2 を読み取ろうとして実際にチャネル 1 のデータが recv() されたため、select( ) がハングします。

私が現在採用している回避策は、ソケットの生データカウンターを保持し、それらを使用して libssh2 によって新しいデータが消費されたかどうかを判断することですが、かなり単純な問題に対して非常に複雑な回避策を講じているような気がします。何か不足していますか?libssh2_session_read_any_channel() のようなものはありますか?

4

0 に答える 0