2015-02-10 1 views
2

Используя Qt5 с библиотекой libcurl, я пытаюсь загрузить каталог с локального FTP-сервера. Если я сохраню все curl_easy_setopt() и curl_easy_perform() в main(), он отлично работает. Однако, если я попытаюсь поместить их все в функцию для одного вызова, программа выйдет из строя, когда она дойдет до curl_easy_perform().libcurl curl_easy_perform() сбрасывает программу при перемещении внутри функции

Я использую Libcurl версии 7.40.0 - Win32 Generic 2000/XP

#include "mainwindow.h" 
#include <QApplication> 
#include <curl/curl.h> 
#include <QDebug> 
#include <QFile> 

struct FtpFile { 
    const char *filename; 
    FILE *stream; 
}; 

size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream) 
{ 
    struct FtpFile *out=(struct FtpFile *)stream; 
    if(out && !out->stream) { 
    /* open file for writing */ 
    out->stream=fopen(out->filename, "wb"); 
    if(!out->stream) 
     return -1; /* failure, can't open file to write */ 
    } 
    return fwrite(buffer, size, nmemb, out->stream); 
} 

int DownloadToFile(CURL *curl, FtpFile *file, bool ClearAfterWrite) 
{ 
    qDebug() << "Before URL set"; 
    curl_easy_setopt(curl, CURLOPT_URL, "ftp://127.0.0.1"); 
    qDebug() << "URL set"; 

    curl_easy_setopt(curl, CURLOPT_USERPWD, "maptester:sync"); 
    qDebug() << "Login set"; 

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite); 
    qDebug() << "Write Function set"; 

    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&file); 
    qDebug() << "Write Data set"; 

    int Result = curl_easy_perform(curl); 
    qDebug() << "curl perform passed"; 

    if(ClearAfterWrite) 
    { 
     file->stream = NULL; 
    } 

    return Result; 
} 


int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 


    FtpFile ftpfile = 
    { 
     "C:\\users\\Ir77\\Desktop\\ftpLS.txt", /* name to store the file as if succesful */ 
     NULL 
    }; 

    curl_global_init(CURL_GLOBAL_DEFAULT); 

    CURL *curl = curl_easy_init(); 
    qDebug() << "easy init passed"; 
    if(curl) 
    { 
     int Result; 
     qDebug() << "curl check passed"; 
#if 1 
     Result = DownloadToFile(curl, &ftpfile, true); 
#else 
     curl_easy_setopt(curl, CURLOPT_URL, "ftp://127.0.0.1/"); 

     curl_easy_setopt(curl, CURLOPT_USERPWD, "maptester:sync"); 

     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite); 

     curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&ftpfile); 

     Result = curl_easy_perform(curl); 

#endif 

     if(Result != CURLE_OK) 
     { 
      qDebug() << "File Download error!"; 
     } 
     else 
     { 
      qDebug() << "File got something!"; 
     } 

     /* always cleanup */ 
     curl_easy_cleanup(curl); 
    } 

    curl_global_cleanup(); 


    return a.exec(); 
} 
+0

Ваши оба теста не равны. Попробуйте 'ftp: // 127.0.0.1 /' с завершающей косой чертой внутри 'DownloadToFile' –

+0

Спасибо за уловку, все равно падает на том же месте, хотя ... – Salads

ответ

2

file внутри DownloadToFile уже указатель на ftpfile -структурой, поэтому удалите & перед переменной file:

curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)file); 
+1

Вот оно! Есть задержка, пока я не могу отметить ответ, но я буду! Спасибо!! – Salads

+0

Хороший улов. +1 для этого. –