gpt4 book ai didi

c++ - libcurl curl_easy_perform() 在函数内部移动时使程序崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 02:24:07 25 4
gpt4 key购买 nike

使用带有 libcurl 库的 Qt5,我尝试从我的本地 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com