我使用最新的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应用程序的一部分,所以需要一点努力才能完成。