Libcurl throwing error when downloading ERROR : unknown error

Libcurl throwing error when downloading ERROR : unknown error

我正在尝试为我的项目测试 libcurl,但是当我想下载测试文件时出现错误:

ERROR : Unknown error

但不知道为什么会这样, 我的代码:

#include <stdio.h>
#include <curl/curl.h>
 
int main(int argc, char **argv) {

    CURL *curl;
    FILE *fp;
    char name[30] = {"Test"};
    char link[100] = {"ipv4.download.thinkbroadband.com/5MB.zip"};
    CURLcode error;
    int result;
    fp = fopen(name,"Wb");

    curl = curl_easy_init();
    curl_easy_setopt;(curl, CURLOPT_URL, argv[1] );
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
    curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L);

    curl_easy_perform(curl);
    result = curl_easy_perform(curl);
    
    if (result = CURLE_OK)
        printf("Sucessful download !");
    else
        printf("Could not download, ERROR : %s \n",curl_easy_strerror(error));
        printf("%s",error);

    fclose(fp);
    curl_easy_cleanup(curl);
}

完全猜测 - 但它是否与您的代码调用 curl_easy_perform(curl); 两次而不是一次有关?

这看起来很可疑:

curl_easy_perform(curl);
result = curl_easy_perform(curl);

不应该只是:

result = curl_easy_perform(curl);

此外,link 不应该有 http 前缀吗?

char link[100] = {"http://ipv4.download.thinkbroadband.com/5MB.zip"};

关于您的代码缩进,至少在您的 else 路径中缺少大括号。这意味着无论结果值如何,都会执行最后一个 printf ... 如果你像这样添加大括号,它是否按预期工作?当然连同 selbie 和 Emanuel P 提出的其他建议...

if (result == CURLE_OK) {
    printf("Sucessful download !");
} else {
    printf("Could not download, ERROR : %s \n",curl_easy_strerror(error));
    printf("%s",error);
}

代码中有一堆错误。

  • fopen 的参数应该是小写“w”。
  • 您同时声明了 errorresult,但应该只使用一个。
  • 此行中间有一个分号:curl_easy_setopt;(curl, CURLOPT_URL, argv[1] );

结合已经提到的内容,这应该有效:

#include <stdio.h>
#include <curl/curl.h>

int main(int argc, char **argv) {

    if(argc < 2) {
       puts("URL not given");
       return 1;
    }

    CURL *curl;
    FILE *fp;
    char name[30] = {"Test"};
    char link[100] = {"ipv4.download.thinkbroadband.com/5MB.zip"};
    CURLcode result;
    fp = fopen(name,"w");

    curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, argv[1] );
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
    curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L);

    result = curl_easy_perform(curl);
    
    if (result == CURLE_OK)
        printf("Sucessful download !");
    else
        printf("Could not download, ERROR : %s \n",curl_easy_strerror(result));

    fclose(fp);
    curl_easy_cleanup(curl);
    return 0;
}

不要忘记将 URL 作为参数传递,因为您实际上并没有使用 link 并且不检查 argc。我建议你学习如何使用调试器。