C++ 诊断libssh2-SFTP阻塞调用
我正在使用libssh2的最新Git树来执行一些SFTP工作。我正在使用非阻塞接口 我成功地建立了到SFTP服务器的连接、登录和传输文件 但是,我遇到了一个问题,对C++ 诊断libssh2-SFTP阻塞调用,c++,sftp,libssh,libssh2,C++,Sftp,Libssh,Libssh2,我正在使用libssh2的最新Git树来执行一些SFTP工作。我正在使用非阻塞接口 我成功地建立了到SFTP服务器的连接、登录和传输文件 但是,我遇到了一个问题,对libssh2\u sftp\u write(sftp\u handle,ptr,nread)plain的调用挂起。此总是在传输237115172字节数据后发生。 虽然有效载荷小于这个数字,但一切进展顺利 我正在传输多个文件。我对整个事务使用一个SSH会话(和一个套接字)。有人能提出解决这个问题的方向吗?神奇的数字237115172是
libssh2\u sftp\u write(sftp\u handle,ptr,nread)
plain的调用挂起。此总是在传输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);
do
{
nread=fread(m_缓冲区,1,sizeof(m_缓冲区),本地);
//
//EOF
//
如果(nread 0);
我可以发布完整的源代码,但是它很长,而且因为它是QT应用程序的一部分,所以需要花费一些努力才能删除。我注意到我安装了两个版本的libssh2:1.2.2.in/usr和1.3.0(来自git存储库)in/usr/local。我没有任何特定版本的附件,所以我删除了最近的一个版本(旧版本是对我机器上其他软件的依赖)
我不得不做两三个小改动来适应旧的界面,但至少原始问题中描述的问题消失了。@John Zwinck:它被定义为
char m_buffer[1024*100]
试试把它设为25K,只是开玩笑而已。我曾经遇到过一个奇怪的libssh2问题,它只在我的缓冲区为32KB或更大的时候出现。我不知道确切的原因(当时我发现了一些提示,但后来忘记了),但这是库中的某种错误。我将缓冲区更改为31KB,此后它一直工作。@John Zwinck:谢谢你的建议。不幸的是,它仍然挂起。但是,当传输的字节数为147671992时,这种情况总是会发生。我稍后将研究这两个数字之间的关系。你可以尝试使用Wireshark to想象一下网络上发生了什么……注意1.2.2版已经两年了,8个版本已经过时。试试1.3.0版,看看效果是否更好。注意libssh2没有1.5版。@Dan:我的错,版本是Git回购的1.3.0。我已经修改了我的帖子。