C++ 诊断libssh2-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的最新Git树来执行一些SFTP工作。我正在使用非阻塞接口

我成功地建立了到SFTP服务器的连接、登录和传输文件

但是,我遇到了一个问题,对
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。我已经修改了我的帖子。