我正在使用 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);
我注意到我安装了两个版本的 libssh2:1.2.2。在 /usr 中,1.3.0(来自 git 存储库)在 /usr/local 中。 我没有任何特定版本的附件,因此我删除了较新的版本(较旧的版本是我计算机上其他软件的依赖项)。
我不得不做两三个小改动来适应旧的界面,但至少原来问题中描述的问题消失了。