2011-11-12 21 views
0

私はいくつかのSFTP作業を実行するためにlibssh2の最新のGitツリーを使用しています。私は非ブロッキングインターフェイスを使用しています。libssh2 SFTPブロッキングコールの診断

SFTPサーバーへの接続の確立、ログイン、ファイルの転送に成功しました。

ただし、libssh2_sftp_write(sftp_handle, ptr, nread)への呼び出しがハングするという問題が発生しました。このはいつもは、237115172バイトのデータが転送された後に発生します。
ペイロードはこの数よりも小さいものの、処理は順調です。

複数のファイルを転送しています。私は、トランザクション全体に対して単一のSSHセッション(および単一のソケット)を使用しています。誰もがこの問題を解決するための方向を示唆することができますか?マジックナンバー237115172はヒントですが、まだ私には分かりません。私は何が間違っていますか?

これはストレートlibssh2の例のうち、コードです:私は完全なソースを投稿することができ

do 
{ 
    nread = fread(m_buffer, 1, sizeof(m_buffer), local); 
    // 
    // EOF 
    // 
    if (nread <= 0) 
     break; 
    ptr = m_buffer; 
    total += nread; 
    do 
    { 
     // 
     // FIXME: this hangs sometimes... why?! 
     // 

     /* write data in a loop until we block */ 
     while 
     (
      (rc = libssh2_sftp_write(sftp_handle, ptr, nread)) 
      == 
      LIBSSH2_ERROR_EAGAIN 
     ) 
     { 
      if (m_aborted) 
       goto cleanup; 
      waitsocket(m_sock, m_session); 
     } 
     if (rc < 0) 
      break; 
     ptr += rc; 
     nread -= rc; 
     m_uploadedBytes += rc; 
     emit totalUploadChanged(100*(float)m_uploadedBytes/m_totalBytes); 
    } 
    while (nread); 
} 
while (rc > 0); 

が、それはかなり長いです、そして、それはQTアプリの一部だから、それは努力のビットを取るだろうリッピングする

+0

m_bufferの大きさはどれくらいですか? –

+0

@John Zwinck:それは 'char m_buffer [1024 * 100];と定義されています。 – misha

+0

これは林の上で25Kにしてみてください。かつて私のバッファが32KB以上であったときにのみ発生したlibssh2には奇妙な問題がありました。私はなぜ(私は忘れてしまった後にいくつかのヒントを見つけた)正確な理由は分かっていませんが、それは図書館にある種のバグでした。私はバッファを31KBに変更し、それは永遠に働いた。 –

答えて

0

私はlibssh2の2つのバージョンがインストールされていることに気付きました:1.2.2。/usrと1.3.0(gitリポジトリから)/ usr/localにあります。私は特定のバージョンへの添付ファイルを持っていなかったので、最近のものを削除しました(古いものは私のマシン上の他のソフトウェアに依存していました)。

私は古いインターフェイスに適応するために2〜3つの小さな変更を加えなければなりませんでしたが、少なくとも元の質問に記載されている問題はなくなりました。

+0

バージョン1.2.2は2年8バージョンが古くなっています。バージョン1.3.0を試してみてください。 libssh2のバージョン1.5はありません。 – Dan

+0

@ダン:悪いです、バージョンはGitリポジトリから1.3.0でした。私は私のポストを修正しました。 – misha