れんしゅう

とりあえずcURLをいじってみた。

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

#define DEBUG(s) do { cerr << (s) << endl; } while(0)

using namespace std;

class Curl {
private:
  CURL *handle;
  string url;
  string buf;
  static size_t puts(char *ptr, size_t size, size_t nmemb, void *stream);

public:
  Curl(string url);
  ~Curl();
  CURLcode perform();
  string data();
};

size_t Curl::puts(char *ptr, size_t size, size_t nmemb, void *stream) {
  string *buf = static_cast<string *>(stream);
  buf->append(ptr);
  return size * nmemb;
}

Curl::Curl(string url) : handle(curl_easy_init()), url(url) {
  curl_easy_setopt(this->handle, CURLOPT_WRITEDATA, &(this->buf));
  curl_easy_setopt(this->handle, CURLOPT_WRITEFUNCTION, &puts);
  curl_easy_setopt(this->handle, CURLOPT_URL, this->url.c_str());
}

Curl::~Curl() {
  curl_easy_cleanup(handle);
}

CURLcode Curl::perform() {
  return curl_easy_perform(this->handle);
}

string Curl::data() {
  return this->buf;
}

int main() {
  curl_global_init(CURL_GLOBAL_ALL);
  Curl curl("http://www.hatena.ne.jp/");
  curl.perform();
  cout << curl.data() << endl;
}

分からないこと多いなぁ…

  • puts()をstaticじゃなくしたらハマった。なんで?
  • マクロ使うのはありなのかしらん?
  • staticな文字列でメンバ変数を初期化したら、メンバ変数のメモリ領域はいつ開放されるんだろう?
  • ポインタじゃないメンバ変数を返したら、コピーが返るのか?
    • その場合、メモリはいつ解放されるん?