使用 Qt5 和 libcurl 库,我尝试从本地 FTP 服务器下载目录列表。如果我将所有的curl_easy_setopt()和curl_easy_perform()保留在main()中,它就可以完美工作。但是,如果我尝试将它们全部放入一个函数中进行一次调用,则程序在调用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();
}
最佳答案
DownloadToFile
中的
file
已经是指向 ftpfile
结构的指针,因此删除前面的 &
文件
变量:
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)file);
关于c++ - libcurl curl_easy_perform() 在函数内部移动时导致程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28427163/