Используя 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();
}
Ваши оба теста не равны. Попробуйте 'ftp: // 127.0.0.1 /' с завершающей косой чертой внутри 'DownloadToFile' –
Спасибо за уловку, все равно падает на том же месте, хотя ... – Salads