【问题标题】:libssh2 - read file with SFTPlibssh2 - 使用 SFTP 读取文件
【发布时间】:2017-07-09 16:45:26
【问题描述】:

我正在使用 libssh2 lib 与设备进行 SFTP 会话。

但是当我尝试读取文件并返回输出时,永远不要返回完整的文件。

我认为是因为文件中间的控制字符(如\0)。

代码:

sftp_handle = libssh2_sftp_open(sftp_session, filename, LIBSSH2_FXF_READ, 0);
if (!sftp_handle) return "-1";
char buf[99999];
int x = libssh2_sftp_read(sftp_handle, buf, sizeof(buf));
char * output = (char *)malloc(sizeof(char)*x);
memcpy(output, buf, x);
output[x] = '\0';
libssh2_sftp_close(sftp_handle);

************更新1************

我要读取的文件是一个包含几乎所有 ascii 字符的文本文件。

************更新2************

x 是写入缓冲区的字节数,文件有 ~98kb(99999 字节),但 libssh2_sftp_read 函数返回 30000 到 x

【问题讨论】:

  • 您检查过libssh2_sftp_read 实际返回的内容吗?您尝试读取的文件是什么类型的文件?它的内容是什么?它是可以包含嵌入零的二进制文件吗?如果它是二进制文件,则不要使用文本输出(如cout << output 等)。您收到的数据的目的是什么?你应该如何使用这些数据?
  • libssh2_sftp_readmemcpy 都不会停在\0,你应该检查x
  • 开始使用 std::string 并将其打印出来,operator<< for (const) char* 将在 \0 停止。
  • @Someprogrammerdude 我更新以添加文件的一些信息。 libssh2_sftp_read 将返回他写入缓冲区的字节数。 cout 我忘记删除了! xD
  • @RickAstley Yap,文件有 ~98kb,但 x 为 30000。但输出比这小得多

标签: c++ string sftp libssh2


【解决方案1】:

我假设代码只是 sn-p,因此如果存在围绕基本 sn-p 旋转的循环,则以下注释可能不合适。

libssh2_sftp_read() 可能无法读取文件的完整字节,但它可以在单个调用中读取的最大值。因此,可能需要重复此调用,直到它返回零或扫描读取缓冲区以检查 EOF 字符。 [EOF 检查可能使您的代码依赖于平台]。只需突出显示下面的手册页。

从 LIBSSH2_SFTP_HANDLE 读取数据块。这种方法是 仿照 POSIX read(2) 函数并使用相同的调用 语义。 libssh2_sftp_read,将尝试尽可能多地读取 但是,如果文件指针到达 结束,或者如果进一步读取会导致套接字阻塞。

【讨论】:

  • 一个问题是 libssh2_sftp_read() 返回 30000 并且输出有 224 个字节。
  • @Samega7Cattac “输出有 224 字节” 是什么意思?无论如何,您的问题在哪里提供了这些信息?
猜你喜欢
  • 2021-02-02
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多