用C ++将文件从URL下载到磁盘

时间:2012-04-07 08:24:36

标签: c++ macos url curl

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

3 个答案:

答案 0 :(得分:1)

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

system("curl -o ...")

system("wget ...")

答案 1 :(得分:0)

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

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

修改

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

<强> EDIT2

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

答案 2 :(得分:0)

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

但是HTTP现在是一个非常复杂的协议。仅它的规格是漫长而复杂的(超过一百页)。 libcurl是一个实现它的好库。

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