我正在使用最新的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,並且一直運行。 –