libssh2の最新のGitツリーを使用して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アプリの一部であるため、削除するには少し手間がかかります。