2011-11-12 89 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