【问题标题】:Curl gives segmentation fault error卷曲给出分段错误错误
【发布时间】:2018-08-13 12:55:54
【问题描述】:

我正在尝试从服务器下载 .txt 文件,我可以通过树莓派上的网络浏览器访问该文件。

当我尝试这样做时,Curl 库会出现分段错误。这是我正在使用的代码。

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
    size_t written = fwrite(ptr, size, nmemb, stream);
    return written;
}


int checkNewFiles(){
    CURL *curl;
    FILE *fp;
    CURLcode res;
    string url = "http://52.233.176.151:1880/files/device/software/text.txt";
    char outfilename[FILENAME_MAX] = "/home/pi/Desktop/project/cpp/ab.txt";
    curl = curl_easy_init();
    if (curl) {
        fp = fopen(outfilename, "wb");
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        fclose(fp);
      }
    return 0;
}

【问题讨论】:

  • write_data 看起来不合适
  • write_data 必须有正确的原型,否则代码未定义。您还需要确保文件已成功打开。 (顺便说一句:您只是在复制默认行为。)
  • 我怀疑FILENAME_MAX 比你的覆盆子可以处理的大得多。使用char outfilename[]const char* outfilename

标签: c++ curl raspberry-pi3 libcurl raspbian


【解决方案1】:

我发现了问题,url.c_str() 在做什么?

curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

改成

curl_easy_setopt(curl, CURLOPT_URL, url);

示例:下载文本文件的 Curl 程序。

当然你需要在这里添加这个必要的头文件。

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
    size_t written = fwrite(ptr, size, nmemb, stream);
    return written;
}

int main(void) {
    CURL *curl;
    FILE *fp;
    CURLcode res;
    const char *url = "http://localhost/yourfile.txt";
    char outfilename[FILENAME_MAX] = "C:\\outfile.txt";
    curl = curl_easy_init();
    if (curl) {
        fp = fopen(outfilename,"wb");
        curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1); /* enable failure on http errors */
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        if(res != CURLE_OK) { /* check that the operation was successful */
          printf("curl_easy_perform(): %s\n", curl_easy_strerror(res));
        }
        /* always cleanup */
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    return 0;
}

【讨论】:

  • 来自文档:“传入一个指向要使用的 URL 的指针。参数应该是一个 char * 到一个以零结尾的字符串,该字符串必须按照以下格式进行 URL 编码:”std: :string::c_str() 返回一个 const char*;不是字符*;然而;你的代码现在有 char* url = <hard coded string> 至少应该给你警告。
  • 它解决了分段错误错误,但现在文件已下载为 0 字节。虽然当我将链接粘贴到浏览器时它已成功下载。我一直在尝试下载的文件约为 1.4 Mb
【解决方案2】:

我注意到您在fopen 之后没有检查错误。如果失败,它会返回一个NULL 指针,这会在 curl 尝试写入时导致段错误。

我不相信 c_str() 是原始问题中您的段错误的罪魁祸首,因为我在许多应用程序中都使用了它,没有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2017-01-02
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多