Я использую самое последнее дерево Git в libssh2 для выполнения некоторых SFTP-работ. Я использую неблокирующий интерфейс.
Мне удалось установить соединение с SFTP-сервером, войти в систему и передать файлы.
Однако я столкнулся с проблемой, когда зависает вызов libssh2_sftp_write(sftp_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);
Я могу опубликовать полный исходный код, но он довольно длинный, и, поскольку он является частью приложения QT, для его извлечения потребуется немного усилий.