2012-01-27 1 views
0

EDIT

У меня была проблема некоторое время назад, написание программы в C, который использует УПП для передачи и загрузки файлов на сервер. Программа должна была быть написана для окон. Сначала я попытался использовать библиотеку libCurl, после чего я столкнулся с различными проблемами, и это не сработало. После переключения на libssh и проблема была исправлена.
Я размещаю сегмент моего образца кода, который загружает файл с удаленного сервера. надеюсь, это может быть полезно любому, кто приземляется здесь.функциональность SCP в C. списке библиотек: Libcurl, libssh или libssh2

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

Что не так с 'scp'? – Philip

+0

Я забыл упомянуть, я на машинке для окон. – ArmenB

+0

Если вам просто интересно выполнить задачу, я предлагаю использовать Cygwin (эмулятор Linux для MS Windows). – Philip

ответ

1

Переведено в lilbssh. Вы можете управлять этапами scp вручную и работать нормально. Однако я не знаю, лучше ли libssh2 или нет. Любые комментарии?