2

libssh2_channel_write_exマニュアルページから:

書き込まれた実際のバイト数、または失敗した場合は負。LIBSSH2_ERROR_EAGAIN がブロックされる場合。LIBSSH2_ERROR_EAGAIN は負の数ですが、それ自体は実際には失敗ではありません。

今、私はそれに問題があります。受信した場合LIBSSH2_ERROR_EAGAIN、何も送信されておらず、すべてのデータを再送信する必要があるということですか? それとも何らかのデータが送信されたということですか

私の問題は、基になるソケットが保持できるより多くのデータを送信しようとしている場合、とにかくブロックする必要があることです。今後、毎回write()取得せずに大きなデータブロックを送信するにはどうすればよいですか?LIBSSH2_ERROR_EAGAIN

4

2 に答える 2

3

LIBSSH2_ERROR_EAGAIN バッファにあるデータが送信されていない場合に発生します。Select() を使用してソケットが生きているかどうかを確認した後、再度送信できます。Select() がイベントを返す場合は、適切に処理して再送信できます。

ループはこんな感じ

    do
    {
     While (rc = libssh2_Channel_write_ex () == LIBSSH2_ERROR_AGAIN )
     {
      if(!select()) // Wait for timeout
        //Timeout
     }
     if(rc>0)
      //Read next set of data into buffer for sending
     else if(rc <0)
      // Libssh2 error
    }
于 2012-03-21T18:57:44.627 に答える
2

LIBSSH2_ERROR_EAGAIN は、何も送信されなかったことを意味し、すべてを再度送信する必要があります。何かが送信された場合、代わりにその番号が返されます。

于 2011-05-18T18:06:43.437 に答える