1

簡単な質問があります。curl のような C++ (Mac OSX 用) ライブラリを使用せずに、インターネットから (URL からディスクに) ファイルをダウンロードする簡単なコードを作成することは可能ですか? いくつかの例を見てきましたが、これらはすべて Curl ライブラリを使用しています。

このコードを xcode プロジェクトで使用していますが、コンパイル (リンク) エラーがいくつかあります

    #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.1 は Host ヘッダーを送信する必要があるため、リクエストが HTTP/1 準拠のクライアントから送信されたふりをするように変更されました。

EDIT2

OPは質問を変更しました。これは、Xcodeでライブラリとリンクする方法に関するものになりました。SO にはすでに同様の質問があります。

于 2012-04-07T08:31:52.727 に答える
1

「URL からファイルをダウンロードする」とは、基本的にGETリモート HTTP サーバーへのリクエストを行うことを意味します。そのため、その HTTP 要求を実行する方法をアプリケーションに認識させる必要があります。

しかし、HTTPは現在、非常に複雑なプロトコルです。その仕様だけでも長くて複雑です (100 ページ以上)。libcurlは、それを実装する優れたライブラリです。

複雑なプロトコルを実装する優れた無料ライブラリの使用を避けたいのはなぜですか? もちろん、複雑な HTTP プロトコルを自分で実装することもできます (おそらく何年もの作業が必要です)。または、HTTP プロトコルのすべての詳細を実装していないが動作する可能性がある最小限のプログラムを作成することもできます (ただし、奇妙な HTTP サーバーでは動作しません)。 )。

于 2012-04-07T08:33:13.483 に答える