簡體   English   中英

C庫列表中的SCP功能:libCurl,libssh或libssh2

[英]SCP functionality in C. library list: libCurl, libssh or libssh2

編輯

前段時間我遇到了一個問題,該問題使用C語言編寫了一個程序,該程序利用scp將文件傳輸並下載到服務器。 該程序必須為Windows編寫。 最初,我嘗試使用libCurl庫,然后遇到了不同的問題,並且運行不正常。 切換到libssh之后,此問題已解決。
我正在發布我的示例代碼的一部分,該部分從遠程服務器下載文件。 希望這對任何登陸這里的人都有幫助。

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;
}

切換到lilbssh。 您可以手動管理scp階段,並且可以正常工作。 但是,我不知道libssh2是否更好。 任何意見?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM