Ошибка сегментации с использованием cURL

#c #curl #segmentation-fault #libcurl

#c #curl #ошибка сегментации #libcurl

Вопрос:

Я пытаюсь загрузить тестовый файл со своего сервера, используя библиотеку cURL с этим кодом:

 #define CURL_STATICLIB

#include <stdio.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
#include <string.h>

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
    size_t written;

    written = fwrite(ptr, size, nmemb, stream);
    return written;
}

int main(void)
{
    CURL *curl;
    FILE *fp;
    CURLcode res;

    char *url = "http://pixhost.tk/test.txt";
    char outfilename[FILENAME_MAX] = "/Users/Nathan/Desktop";
    curl = curl_easy_init();

    if (curl)
    {
        fp = fopen(outfilename, "wb");

        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);

        curl_easy_cleanup(curl);
        fclose(fp);
    }

    return 0;
}
  

И компиляция его следующим образом:

 $ gcc main.c -lcurl -o curltest
  

Но когда я выполняю это, я получаю ошибку ошибки сегментации. Что я должен сделать, чтобы исправить это?

Ответ №1:

Я не знаком с cURL, но две вещи, которые могли бы вам помочь, так что простите меня, если я говорю глупости:

  1. char *url = "http://pixhost.tk/test.txt"; это строка, доступная только для чтения, поэтому измените ее на const char *url = "http://pixhost.tk/test.txt"; это может выявить вашу проблему во время компиляции.
  2. Вы не проверяете результат fopen , возможно, это сбой, что объясняет ошибку сегментации, и мне это кажется вероятным, поскольку вы пытаетесь открыть «/ Users / Nathan / Desktop», который должен быть каталогом AFAIK.

Комментарии:

1. Я тоже, a3_nm. Похоже, что он пытается открыть каталог для записи.

Ответ №2:

Прошло некоторое время с тех пор, как я работал с curl, и я не уверен, что это вызовет ошибку сегментации, я думаю, вам следует вызывать fwrite следующим образом:

 fwrite(ptr, 1, nmemb * size, stream);
  

Потому что fwrite возвращает количество записанных элементов, и size не (я не думаю) гарантируется, что оно будет одним. И поскольку вы возвращаете то, что возвращает fwrite, я полагаю, что вы возвращаете меньше байтов, чем вы на самом деле записываете, поскольку функция должна возвращать, сколько байтов она записала.