首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C库中的SCP功能列表: libCurl、libssh或libssh2

C库中的SCP功能列表: libCurl、libssh或libssh2
EN

Stack Overflow用户
提问于 2012-01-27 10:39:35
回答 1查看 1.4K关注 0票数 0

编辑

不久前,我用C语言编写了一个程序,它利用scp将文件传输和下载到服务器上,遇到了一个问题。这个程序必须是为windows编写的。最初,我尝试使用libCurl库,然后我遇到了不同的问题,它不能很好地工作。在切换到libssh之后,该问题已修复。

我发布了一段从远程服务器下载文件的示例代码。希望这能对任何在这里登陆的人有所帮助。

代码语言:javascript
复制
int scp_recv_file(ssh_session in_session,
                 char * in_remotefile, char * in_localfile)
{
  ssh_scp   t_scp = NULL;
  int       t_rc, t_filesize, t_filemode = -1;
  char      *t_filename, *t_buffer;

  t_scp = ssh_scp_new
    (in_session, SSH_SCP_READ | SSH_SCP_RECURSIVE, in_remotefile);


  if (t_scp == NULL)
  {
    fprintf(stderr, "Error allocating scp session: %s\n",
            ssh_get_error(in_session));
    return SSH_ERROR;
  }

  t_rc = ssh_scp_init(t_scp);
  if (t_rc != SSH_OK)
  {
    fprintf(stderr, "Error initializing scp session: %s\n",
            ssh_get_error(in_session));
    ssh_scp_free(t_scp);
    return t_rc;
  }

  //create ssh pull a file request
  t_rc = ssh_scp_pull_request(t_scp);
  if (t_rc != SSH_SCP_REQUEST_NEWFILE)
  {
    fprintf(stderr, "Error receiving information about file: %s\n",
            ssh_get_error(in_session));
    return SSH_ERROR;
  }

  t_filesize = ssh_scp_request_get_size(t_scp);
  t_filename = strdup(ssh_scp_request_get_filename(t_scp));
  t_filemode = ssh_scp_request_get_permissions(t_scp);

  printf("Receiving file %s, size %d, permisssions 0%o\n",
          t_filename, t_filesize, t_filemode);

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

  ssh_scp_accept_request(t_scp);
  t_rc = ssh_scp_read(t_scp, t_buffer, t_filesize);
  if (t_rc == SSH_ERROR)
  {
    fprintf(stderr, "Error receiving file data: %s\n",
            ssh_get_error(in_session));
    free(t_buffer);
    return t_rc;
  }
  printf("Done\n");

  //write buffer to file
  writeToFile(in_localfile, t_buffer, t_filesize);
  //write(1, buffer, size);

  //free allocated memory
  free(t_buffer);
  free(t_filename);


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



  //close scp and free
  ssh_scp_close(t_scp);
  ssh_scp_free(t_scp);
  return SSH_OK;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-02 03:56:04

切换到lilbssh。您可以手动管理scp阶段,并且工作正常。然而,我不知道libssh2是不是更好。有什么意见吗?

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

https://stackoverflow.com/questions/9028347

复制
相关文章

相似问题

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