首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Libssh2停止读取大文件

Libssh2停止读取大文件
EN

Stack Overflow用户
提问于 2020-10-19 18:18:02
回答 1查看 82关注 0票数 0

我需要通过ssh读取一些文件,但是当我在文件上循环读取时.它停止了。

在我的Cargo.toml中,我有一个依赖项:

代码语言:javascript
复制
[dependencies]
ssh2 = "0.8"

这取决于libssh2。

代码更复杂,但我成功地再现了这个脏代码的问题:

代码语言:javascript
复制
  use std::fs::File;
  use std::io::Read;
  use std::io::Write;
  #[allow(unused_imports)]
  use std::io::Error;
  use std::net::TcpStream;
  use ssh2::Session;
  use std::path::Path;
  use std::io::prelude::*;

  fn main() {
      println!("Parto!");

      let tcp = TcpStream::connect("myhost:22").unwrap();
      let mut sess = Session::new().unwrap();
      sess.set_tcp_stream(tcp);
      sess.handshake().unwrap();
      sess.userauth_password("user", "password").unwrap();
      assert!(sess.authenticated());

      let (mut remote_file, stat) = sess.scp_recv(Path::new("/home/pi/dbeaver.exe")).unwrap();
      println!("remote file size: {}", stat.size());
      let mut buf: Vec<u8> = vec![0;1000];

      loop {
          let read_bytes = remote_file.read(&mut buf).unwrap();
          println!("Read bytes: {}.", read_bytes);
          if read_bytes < 1000 {
              break;
          }
      } //ending loop
  }

我在Windows 10和Linux上都进行了测试。当文件大于几KB时,问题总是存在。

代码语言:javascript
复制
let read_bytes = remote_file.read(&mut buf).unwrap();

读取小于缓冲区大小(但文件未结束)。

使用二进制或asci文件进行测试。

没有错误,它只是停止阅读。奇怪的是:它有时停在8 MB,有时在16 KB。有同样的文件和主机..。

我要在哪里挖或者我需要检查什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-20 07:35:25

引用io::读特性的文档( ssh2实现了该特性):

如果返回的值n小于缓冲区大小,即使读取器尚未在流的末尾,也不是错误。例如,这可能是因为现在实际可用的字节较少(例如,接近文件结束),或者因为read()被信号中断。

由于您正在远程读取,这可能只是意味着剩余的字节仍在网络中传输,并且尚未在目标计算机上可用。

如果您确信有足够的传入数据来填充缓冲区,则可以使用read_exact,但请注意,如果可用数据比缓冲区短,这将返回一个错误。

编辑:或者更好的是,使用read_to_end,它不需要事先知道大小(我不知道为什么昨天我写原始答案时看不到它)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64433067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档