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

标签 c++ qt5 libcurl

使用 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/

相关文章:

qt - 使用 QML 还是 C++ 实现?

c++ - 使用 curl 的 HTTP 重定向不会重新发送相同的 http 消息

c++ - C libcurl,限制下载速度 - cpu 使用率达到 100%

c++ - 使用线程停止一个 Action

c++ - C++中同类的静态成员变量

C++ Boost 侵入列表 - 示例

macos - Qt 和 OpenGL OS X : GLSL shader version only 120 on Mountain Lion

c++ - 立方体在 QGLWidget 中呈现为正方形

php - curl 错误 (58) : unable to set private key file: '/var/www/work/xml/keys/client.pem' type PEM

C++ 检查模板实例变量的类型