へろー

思いつきであんな長い名前を付けた自分を呪い始めました。DCPRG主幹みたいな名前つけてんじゃねえよオレ。それはともかく、昨夜の夢で「ああ、***を集めたページって、結局のところ21HWと同じじゃんか」と気づいたのですが、***が何か忘れてしまいました。あーあ。

C + libcurl

さて、今日はCもやってみますか。Cが入ってくるとたぶん、途端にライブラリ全集みたいになりますね。今日はとりあえず、こういう事をする時にちょくちょく話題に上る、libcurl。まず、コンパイルはこうやります。このへんも一応書いとこう。

% `curl-config --cc` -o example example.c `curl-config --cflags --libs`

--cflags とかの位置は使うコンパイラで適当に前後せい、とのこと(docs/examples/README)。
では、いっちばん簡単なdocs/examples/simple.cを参考に、一番楽な例を見てみましょう。

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

int main(void)
{
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();

    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "www.google.com");
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }

    return 0;
}

...簡単すぎんねん。perform言われてもわからんよ。いやいや、これは極端な例なんでね。curl_easy_で始まる関数は本当に簡単に使えるように出来ているんだそうです。もうちょっとわかるようにしましょう。

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

int main(void)
{
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();

    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com/"); /* --(1) */

        /* These are default values of curl_easy_setopt().
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite); --(2)
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, stdout); -- (3)
        */

        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }

    return 0;
}

まず(1)で、プロトコルスキームが無いとhttpがデフォルト。本当は(2)や(3)で受信時の処理を設定するはずで、それぞれのデフォルトが、データ受信関数がfwrite(3)で、その出力先がstdout。CURLOPT_WRITEで始まってるのは、curlから見たら書き出す方だからなんでしょうね。ちなみに環境変数にhttp_proxyなどが設定されていると、これもデフォルトで読みます。http/sの他にもftp/s、telnetLDAP、DICT、gopher、file(へー)は読むわ、認証はNTLMまで対応してるわ、えらく高機能なんですなあ。