诊断 libssh2 SFTP 阻塞调用

问题描述 投票:0回答:1

我正在使用 libssh2 的最新 Git 树来执行一些 SFTP 工作。 我正在使用非阻塞接口。

我成功与SFTP服务器建立连接、登录并传输文件。

但是,我遇到了一个问题,即对

libssh2_sftp_write(sftp_handle, ptr, nread)
的调用挂起。 这总是发生在传输 237115172 字节的数据之后。
虽然有效负载小于这个数字,但一切进展顺利。

我正在传输多个文件。 我在整个事务中使用单个 SSH 会话(和单个套接字)。 谁能提出解决这个问题的方向? 神奇的数字 237115172 是一个提示,但对我来说还没有任何意义。 我可能做错了什么?

这是直接来自 libssh2 示例的代码:

char m_buffer[1024*100];
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);
c++ sftp libssh2
1个回答
0
投票

我注意到我安装了两个版本的 libssh2:1.2.2。在 /usr 中,1.3.0(来自 git 存储库)在 /usr/local 中。 我没有任何特定版本的附件,因此我删除了较新的版本(较旧的版本是我计算机上其他软件的依赖项)。

我不得不做两三个小改动来适应旧的界面,但至少原来问题中描述的问题消失了。

© www.soinside.com 2019 - 2024. All rights reserved.