【问题标题】:Diagnosing libssh2 SFTP blocking call诊断 libssh2 SFTP 阻塞调用
【发布时间】:2011-11-12 14:33:01
【问题描述】:

我正在使用 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 应用程序的一部分,因此需要花费一些力气才能撕掉。

【问题讨论】:

  • @John Zwinck:定义为char m_buffer[1024*100];
  • 试着把它变成 25K,只是在云雀。我曾经对 libssh2 有一个奇怪的问题,它只在我的缓冲区为 32 KB 或更大时发生。我不知道确切的原因(当时我发现了一些我已经忘记的提示),但这是库中的某种错误。我将缓冲区更改为 31KB,之后它就一直有效。
  • @John Zwinck:感谢您的建议。不幸的是,它仍然挂起。但是,当传输的字节数为 147671992 时,总是会出现这种情况。稍后我会看看这两个数字之间的关系。
  • 您可以尝试使用 Wireshark 来可视化网络上正在发生的事情......

标签: c++ sftp libssh libssh2


【解决方案1】:

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

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

【讨论】:

  • 请注意,1.2.2 版本已过时两年,有 8 个版本过时。尝试 1.3.0 版,看看效果是否更好。请注意,libssh2 没有 1.5 版本。
  • @Dan:我的错,Git repo 中的版本是 1.3.0。我已经修改了我的帖子。
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 2014-03-23
相关资源
最近更新 更多