【问题标题】:Downloading a file from URL to disk in C++在 C++ 中将文件从 URL 下载到磁盘
【发布时间】:2012-04-07 08:24:35
【问题描述】:

我有一个简单的问题。是否可以编写简单的代码来从互联网(从 URL 到磁盘)下载文件而不使用像 curl 这样的 C++(对于 mac osx)库? 我见过一些例子,但所有这些都使用 Curl 库。

我在我的 xcode projet 上使用此代码..但我有一些编译(链接)错误

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

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://localhost/aaa.txt";
    char outfilename[FILENAME_MAX] = "bbb.txt";
    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;
}

如何将 curl 库链接到我的 xcode 项目?

【问题讨论】:

  • 您可以提供不使用 curl 的原因,以便其他人可以向您展示针对您的特定问题的解决方法。
  • 有可能,但并不简单。例如,您要么必须支持分块编码(这并不简单),要么不发出 HTTP 1.1 请求(这会使您无法进行互操作)。这是一个糟糕的权衡。你的外部问题是什么?
  • 我需要一个简单的脚本来测试..我不会在我的 Mac 上安装这个库来进行这个简单的测试..
  • @GgSalent 所有 Mac 都预装了 cURL(和 libcurl)。你不需要安装任何东西。不要重新发明轮子;使用像 libcurl 这样的库。真的,libcurl 会比不使用自己编写的代码更快、更可靠。
  • 我理解人们无法得到一个写得不好的复杂问题。我不明白什么时候一个简单、清晰的问题会被打扮得太多,以至于“避免”简单、简单、直接的答案。是否可以编写简单的代码来从互联网下载文件? 是的。是的答案,并给出了简单的例子,并不意味着 它总是像使用 cURL 一样工作。要处理所有情况,您必须基本上实现其他人已经很好实现的东西(例如 libcurl);这样做没有意义,这很明显,但对可能性保持好奇总是好的。

标签: c++ macos url curl


【解决方案1】:

你可以启动一个控制台命令,很简单:D

system("curl -o ...")

system("wget ...")

【讨论】:

    【解决方案2】:

    “从 URL 下载文件”基本上是指向某个远程 HTTP 服务器发出 GET 请求。因此,您需要让您的应用程序知道如何执行该 HTTP 请求。

    但是HTTP 现在是一个相当复杂的协议。仅它的规范就很长而且很复杂(超过一百页)。 libcurl 是一个很好的实现它的库。

    为什么要避免使用实现复杂协议的优秀免费库?当然,您可以自己实现复杂的 HTTP 协议(​​可能需要多年的工作),或者制作一个不实现 HTTP 协议的所有细节但可能工作的最小程序(但不适用于奇怪的 HTTP 服务器)。

    【讨论】:

      【解决方案3】:

      您必须学习一些“套接字编程”并实现一个非常基本的 HTTP 协议;最简单的方法是向网站发送"GET /this/path/to/file.png HTTP/1.0\r\n" 之类的字符串;然后,它可能会回答一个 HTTP 标头,您必须解析以至少知道后面的二进制数据的长度(如果请求成功,否则您必须处理 HTTP 错误,或者像 html 页面这样的意外内容类型) .

      This guide 应该给你基本的开始;关于HTTP,这取决于您的需要,有时发送“原始” GET 就足够了,有时则不行。

      编辑

      更改为假装请求来自符合 HTTP/1 的客户端,因为 HTTP/1.1 想要发送 Host 标头,正如评论者正确指出的那样。

      EDIT2

      OP 改变了问题,变成了关于如何与 Xcode 中的库链接的问题。已经有一个similar question on SO

      【讨论】:

      • 有时发送一个“原始”GET 可以就足够了(我已经写过了)。我忘记了主机,恢复到 HTTP/1.0。我,我不确定,事实上,如果需要,我会使用 cURL。我不知道用户想要什么,但从问题来看,它似乎想尝试类似于我的答案所示的东西。
      猜你喜欢
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多