1

我有一个简单的问题。是否可以编写简单的代码来从互联网(从 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 项目?

4

3 回答 3

2

您可以启动控制台命令,非常简单:D

system("curl -o ...")

或者

system("wget ...")
于 2012-04-07T08:33:18.297 回答
1

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

本指南应该为您提供基础知识;关于HTTP,这取决于您的需要,有时发送“原始” GET 就足够了,有时则不行。

编辑

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

编辑2

OP 改变了这个问题,它变成了关于如何与 Xcode 中的库链接的问题。在 SO上已经有一个类似的问题。

于 2012-04-07T08:31:52.727 回答
1

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

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

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

于 2012-04-07T08:33:13.483 回答