使用libssh复制文件

年份

我正在尝试编写一个简单的程序(玩具示例),该程序将文件从远程主机复制到本地计算机。

当我尝试复制txt文件但不适用于mp4之类的文件时,此方法有效。

这是我的代码,基本上是本教程中缝合在一起的部分:https : //pastebin.com/0FPrmeDx

这是发生错误的地方:

int scp_receive(ssh_session session, ssh_scp scp)
{
  int rc;
  int size, mode;
  char *filename, *buffer;

  rc = ssh_scp_pull_request(scp);
  if (rc != SSH_SCP_REQUEST_NEWFILE)
  {
    fprintf(stderr, "Error receiving information about file: %s\n",
            ssh_get_error(session));
    return SSH_ERROR;
  }

  size = ssh_scp_request_get_size(scp);
  filename = strdup(ssh_scp_request_get_filename(scp));
  mode = ssh_scp_request_get_permissions(scp);
  printf("Receiving file %s, size %d, permisssions 0%o\n",
          filename, size, mode);
  free(filename);

  buffer = malloc(size);
  if (buffer == NULL)
  {
    fprintf(stderr, "Memory allocation error\n");
    return SSH_ERROR;
  }

  ssh_scp_accept_request(scp);
  rc = ssh_scp_read(scp, buffer, size);
  if (rc == SSH_ERROR)
  {
    fprintf(stderr, "Error receiving file data: %s\n",
            ssh_get_error(session));
    free(buffer);
    return rc;
  }
  printf("Done!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");

  int filedesc = open("/home/user/video.mp4", O_WRONLY | O_CREAT);

  if (filedesc < 0) {
    return -1;
  }

  write(filedesc, buffer, size);
  free(buffer);

  close(filedesc);

  rc = ssh_scp_pull_request(scp);
  if (rc != SSH_SCP_REQUEST_EOF)
  {
    fprintf(stderr, "Unexpected request: %s\n",
            ssh_get_error(session));
    return SSH_ERROR;
  }

  return SSH_OK;
}

代码引发错误:

rc = ssh_scp_pull_request(scp);
if (rc != SSH_SCP_REQUEST_EOF)
{
   fprintf(stderr, "Unexpected request: %s\n",
           ssh_get_error(session));
   return SSH_ERROR;
}

这是我得到的错误:

Unexpected request: ssh_scp_pull_request called under invalid state

我试图弄清楚,但无法取得任何进展。

更新1:

txt和mp4文件的复制文件的大小与源文件的大小完全相同。但是,复制的文件似乎基本上是空的...复制后,权限从更改-rwxr-xr-x--wxr-----

更新2:

文件大小似乎在这里起主要作用。复制很小的文件(10-15kb)不会出现问题。较大的文件不会被复制并产生上述错误...

Ctx

您不能期望,它ssh_scp_read()会在一次调用读取全部数据。您必须进行迭代,直到没有更多数据可读取:

int r = 0;
while (r < size) {
    int st = ssh_scp_read(scp, buffer+r, size-r);
    r += st;
}

现在,对的后续调用ssh_scp_pull_request(scp)应该会成功。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章