2011-11-12 62 views
0

我正在使用最新的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应用程序的一部分,将需要一点努力撕掉。

+0

你的m_buffer有多大? –

+0

@John Zwinck:它被定义为char m_buffer [1024 * 100];' – misha

+0

尝试使它变成25K,就在百灵。我曾经有一个奇怪的问题与libssh2只发生在我的缓冲区是32 KB或更大。我不知道为什么(我发现了一些我后来忘记的提示)的确切原因,但它是库中的某种错误。我将缓冲区更改为31KB,并且一直运行。 –

回答

0

我注意到我安装了两个版本的libssh2:1.2.2。在/ usr/1.3.0(来自git仓库)/ usr/local中。我没有任何特定版本的附件,因此我删除了更新的版本(较旧的版本是我机器上其他软件的依赖版)。

为了适应旧的界面,我不得不进行两三次小的更改,但至少原始问题中描述的问题已消失。

+0

请注意,版本1.2.2是两年和8个版本过期。尝试版本1.3.0,看看这是否更好。请注意,没有版本1.5的libssh2。 – Dan

+0

@Dan:我的不好,这个版本在Git仓库中是1.3.0。我修改了我的帖子。 – misha