0

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アプリの一部であるため、削除するには少し手間がかかります。

4

1 に答える 1

0

libssh2の2つのバージョンがインストールされていることに気づきました:1.2.2。/ usrおよび1.3.0(gitリポジトリから)/ usr/localにあります。特定のバージョンにアタッチメントがなかったので、新しいバージョンを削除しました(古いバージョンは私のマシン上の他のソフトウェアへの依存関係でした)。

古いインターフェースに適応するために2つか3つの小さな変更を加える必要がありましたが、少なくとも元の質問で説明されていた問題はなくなりました。

于 2011-11-14T09:40:06.323 に答える