【问题标题】:sftp_read jumps large blocks of bytes when reading from a filesftp_read 从文件读取时会跳转大块字节
【发布时间】:2014-11-19 11:17:28
【问题描述】:

我正在尝试通过 sftp 下载文件,到目前为止,我已经通过 ssh 会话连接到服务器,然后使用 ssh 会话打开了一个 sftp 会话,一切似乎都很好。我在服务器上打开了一个文件,我正在使用 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 等,它在正确读取 20 个字节后仍会跳转到第 16384 个字节。

这是有原因的吗?有没有比 libssh 和 sftp 更好的库,我可以使用而不会出错?

【问题讨论】:

  • 你没有正确写入流,使用localFile.write(buffer, nbytes)
  • 我正在使用 std::ofstream 写入本地文件。我以前做过,所以语法很好。
  • 问题是。本地文件
  • @asn 实际上 localFile &lt;&lt; buffer 一直写入到它遇到一个空字符,所以它实际上可以写入超过 16kB。
  • 我错过的一个细节是,如果我在填充缓冲区后调试并放置一个断点,我可以看到它用字符填充了整个缓冲区,这些字符来自原始文件(I'已使用十六进制编辑器查看本地和服务器文件的字节)。 sftp_read 只返回 20 个字节,然后跳转其他 16364 个字节。甚至写入的文件输出也明显小于原始文件的大小。

标签: c++ linux ssh sftp libssh


【解决方案1】:

毕竟我不需要使用 libssh。对于任何想要通过 sftp 复制文件的另一种方式的人,只需使用:

system("scp -i private_key user@server.com:directory_to_file/file.txt path_to_local_dir/file.txt");

【讨论】:

  • 嘿伙计,我还有一个问题,你能把你用来连接远程服务器的代码 sn-p 发给我吗
猜你喜欢
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 2020-06-12
  • 2010-10-30
相关资源
最近更新 更多