POCOで簡単Webアクセス

POCOというC++用のライブラリ,とても面白いです.
POCO C++ Libraries - Simplify C++ Development
インストールも簡単で,make一発です.ただ,簡単ということはカスタマイズ性が低く,例えば現状ではicc(Intel C Compiler)で作ることができません.

でも,構造が美しくて分かりやすく,私にはRubyの便利な添付クラスライブラリのような印象を受けました.Rubyはネットワークプログラミングも得意なので,ずいぶん色々なアプリやロボット(クローラ)も作ってみましたが,POCOでも同様に簡単に色々なことができそうです.

試しに,Yahoo!のトップページを取ってきて,ヘッダとボディのHTMLを標準出力に表示するサンプルを書いてみました.

#include <iostream>
#include <Poco/Net/HTTPClientSession.h>
#include <Poco/Net/StreamSocket.h>
#include <Poco/Net/SocketAddress.h>
#include <Poco/Net/HTTPRequest.h>
#include <Poco/Net/HTTPResponse.h>

using namespace std;
int main()
{
  Poco::Net::HTTPClientSession client("www.yahoo.co.jp",80);  // アクセス先の設定
  Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, "/");  // アクセス方法の設定
  Poco::Net::HTTPResponse response;  // 結果を受け取る箱の準備

  ostream &req = client.sendRequest(request);  // アクセスする
  istream &res =  client.receiveResponse(response);  // 結果を取得する
  int len = response.getContentLength();  // ヘッダのContent-Lengthを取得する
  char *resbody = new char[len+1];  // ボディのHTMLを入れる領域を確保する
  response.write(cout);  // HTTPヘッダを出力する
  res.read(resbody,len);  // HTMLボディを取得する
  cout<<resbody<<endl;  // HTMLボディを出力する
  return(0);
}

20行ちょいで書けました.
ソケット通信の知識も必要ありません(それが良いのかって話はありますが...).
もちろん,ナマのソケット通信のプログラムを書くためのクラスも入っています.