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

时间:2015-02-10 08:31:49

标签: 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();
}

1 个答案:

答案 0 :(得分:2)

file内{p> DownloadToFile已经是指向ftpfile - 结构的指针,因此请移除&变量之前的file

curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)file);
相关问题