私はいくつかの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アプリの一部だから、それは努力のビットを取るだろうリッピングする
m_bufferの大きさはどれくらいですか? –
@John Zwinck:それは 'char m_buffer [1024 * 100];と定義されています。 – misha
これは林の上で25Kにしてみてください。かつて私のバッファが32KB以上であったときにのみ発生したlibssh2には奇妙な問題がありました。私はなぜ(私は忘れてしまった後にいくつかのヒントを見つけた)正確な理由は分かっていませんが、それは図書館にある種のバグでした。私はバッファを31KBに変更し、それは永遠に働いた。 –