我使用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应用程序的一部分,因此需要花费一些精力才能删除。
答案 0 :(得分:0)
我注意到我安装了两个版本的libssh2:1.2.2。在/ usr和local中的/ usr和1.3.0(来自git存储库)。我没有对特定版本的任何附件,所以我删除了最近的版本(较旧版本是我机器上其他软件的依赖项)。
我必须进行两到三次小改动以适应旧界面,但至少原始问题中描述的问题消失了。