Поведение libssh2_channel_write, когда канал не блокируется - PullRequest
2 голосов
/ 25 марта 2011

С libssh2_channel_write_ex справочная страница:

Фактическое количество записанных байтов или отрицательное при ошибке.LIBSSH2_ERROR_EAGAIN, когда в противном случае он будет заблокирован.Хотя LIBSSH2_ERROR_EAGAIN - отрицательное число, само по себе это не ошибка.

Теперь у меня проблема с этим.Когда я получаю LIBSSH2_ERROR_EAGAIN, значит ли это, что ничего не было отправлено и что я должен переслать все данные?Или это означает, что некоторые данные были отправлены

Моя проблема в том, что если я пытаюсь отправить больше данных, которые может содержать базовый сокет, write() должен все равно заблокироваться, и впредь, как я могу надеяться отправитьбольшой блок данных без получения LIBSSH2_ERROR_EAGAIN каждый раз?

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

LIBSSH2_ERROR_EAGAIN Произойдет, если не было отправлено никаких данных, которые у вас есть в буфере. Вы можете отправить его снова после проверки, активен ли сокет, используя Select (). Если Select () возвращает событие, вы обрабатываете его соответствующим образом и можете повторно отправить.

Петля выглядит так

    do
    {
     While (rc = libssh2_Channel_write_ex () == LIBSSH2_ERROR_AGAIN )
     {
      if(!select()) // Wait for timeout
        //Timeout
     }
     if(rc>0)
      //Read next set of data into buffer for sending
     else if(rc <0)
      // Libssh2 error
    }
2 голосов
/ 18 мая 2011

LIBSSH2_ERROR_EAGAIN означает, что ничего не было отправлено, и вы должны отправить все заново. Если что-то было отправлено, этот номер будет возвращен вместо.

...