sftp_read пропускает большие блоки байтов при чтении из файла

Я пытаюсь загрузить файл через sftp, и до сих пор я подключался к серверу через сеанс ssh, затем открывал сеанс sftp, используя сеанс ssh, и все вроде нормально. Я открыл файл на сервере и использую sftp_read() для получения блока байтов из файла. Мой код:

char buffer[16384] = {};
ssize_t nbytes;
ssize_t ntotal = 0;
for (;;) {
    nbytes = sftp_read(file, buffer, sizeof(buffer));

    if (nbytes == 0) {
        break; // EOF
    }

    localFile << buffer;
    ntotal += nbytes;
    //sftp_seek(file, ntotal);
}

Но почему-то при чтении блоков первые 20 байт верны, а с 21-го по 16384-й байт неверны. Получается, что прочитав 20 байт, ридер перескакивает на 16384-й байт файла и продолжает чтение как ни в чем не бывало.

Я провел некоторое тестирование, и если я изменил буфер на любой размер, будь то 16384, 21, 22, 50 и т. Д., Он все равно перешел на 16384-й байт после правильного чтения 20 байтов.

Есть причина для этого? Есть ли лучшая библиотека, чем libssh и sftp, которую я могу использовать без ошибок?


person Stapps    schedule 16.11.2014    source источник
comment
вы неправильно пишете в поток, используйте localFile.write(buffer, nbytes)   -  person programmerjake    schedule 17.11.2014
comment
Я использую std::ofstream для записи в локальный файл. Я сделал это раньше, так что синтаксис в порядке.   -  person Stapps    schedule 17.11.2014
comment
Ну проблема в том. localFile ‹‹ буфер; Это всегда будет записывать 16384 байта в файл, даже если вы получили только 2 байта от sftp. Таким образом, вы записываете случайные данные в файл. Программист Джейк прав!   -  person asn    schedule 17.11.2014
comment
@asn на самом деле localFile << buffer записывает, пока не встретит нулевой символ, поэтому на самом деле он может записать гораздо больше, чем 16 КБ.   -  person programmerjake    schedule 17.11.2014
comment
одна деталь, которую я упустил, заключается в том, что если я отлаживаю и помещаю точку останова после заполнения буфера, я вижу, что он заполнил весь буфер символами, символами из исходного файла (я использовал шестнадцатеричный редактор для просмотра байтов как локальных, так и серверных файлов). sftp_read возвращает только 20 байтов, а затем пропускает остальные 16364 байта. Даже записанный файл значительно меньше размера исходного файла.   -  person Stapps    schedule 17.11.2014
comment
Если вы считаете, что в sftp. Пожалуйста, создайте репродуктор, написанный на C. Несколько тысяч человек используют подсистему sftp с использованием libssh, которые не заметили проблем!   -  person asn    schedule 05.12.2014


Ответы (1)


В конце концов, мне не нужно было использовать libssh. Для тех, кто хочет другой способ копирования файлов через sftp, просто используйте:

system("scp -i private_key [email protected]:directory_to_file/file.txt path_to_local_dir/file.txt");
person Stapps    schedule 19.11.2014
comment
эй, чувак, у меня еще одна проблема, не могли бы вы прислать мне фрагмент кода, который вы использовали для подключения к удаленному серверу? - person Kimutai; 14.03.2015