Диагностика libssh2 SFTP блокировки вызова - PullRequest
0 голосов
/ 12 ноября 2011

Я использую самое последнее дерево 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, для его извлечения потребуется немного усилий.

1 Ответ

0 голосов
/ 14 ноября 2011

Я заметил, что у меня установлены две версии libssh2: 1.2.2. в / usr и 1.3.0 (из репозитория git) в / usr / local. У меня не было никаких вложений в конкретную версию, поэтому я удалил более свежую (более старая была зависимостью для других программ на моем компьютере).

Мне пришлось внести два или три небольших изменения, чтобы приспособиться к старому интерфейсу, но, по крайней мере, проблема, описанная в первоначальном вопросе, исчезла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...