我正在使用最新的libssh2 Git树来执行一些SFTP工作。我正在使用非阻塞接口。诊断libssh2 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应用程序的一部分,将需要一点努力撕掉。
你的m_buffer有多大? –
@John Zwinck:它被定义为char m_buffer [1024 * 100];' – misha
尝试使它变成25K,就在百灵。我曾经有一个奇怪的问题与libssh2只发生在我的缓冲区是32 KB或更大。我不知道为什么(我发现了一些我后来忘记的提示)的确切原因,但它是库中的某种错误。我将缓冲区更改为31KB,并且一直运行。 –