2013年5月12日日曜日

cpp-netlib (Boost.Network) であっさり実現する C++ lightweight httpd

cpp-netlibはBoost.Networkとして提案されたBoost.Asioをラップした高レベルネットワークライブラリー。これを使ってhttpdを実装してみます。

準備

git clone git@github.com:cpp-netlib/cpp-netlib.git
git checkout 0.9.4

ミニマルっぽいhttpdのコード

#include <boost/network/protocol/http/server.hpp>

namespace http = boost::network::http;

struct handler;
typedef http::server<handler> http_server;

struct handler {
  void operator()
    ( http_server::request const & request
    , http_server::response & response
    )
  {
    response = http_server::response::stock_reply
      ( http_server::response::ok
      , "hello, world!"
      );
  }
  void log(http_server::string_type const & info)
  {
    std::cerr << "error: " << info << "\n";
  }
};

int main()
{
  handler h;
  http_server s("0.0.0.0", "10080", h);
  s.run();
}

ビルド

g++-4.7.3では問題無くビルドできる。

(clang++-3.2ではBoost.Parameterかそこらがどうも上手くboost::network:http::serverのctorを翻訳できないらしく盛大にコケます。)

g++ -std=c++11 -Wall -pedantic-errors -pthread -lboost_system boost_network_server.cxx

実行中にウェブブラウザー等でアクセスすれば "hello, world!" を拝める。

所感

とりあえず下記参考に掲載のcpp-netlib公式のドキュメントのサンプルコードほとんどそのままで試してみました。

clang++-3.2で翻訳できなかった点については少々しょんぼりしましたが、cpp-netlibを用いるとBoost.Asioから直接httpdを構築するに比べると相当に楽です。

ちなみに、もっと楽をしたい&アレコレまとめてついてるライブラリーを使いたいとなるとPOCOも良い選択肢かもしれません。

参考

0 件のコメント:

コメントを投稿