boost::asioはもっと評価されるべき

boost::asioはネットワークメインの非同期入出力ライブラリです。以前から知ってはいたのですが、使ってみたら予想以上に便利でした。iostream風になってるだけでこんなに便利とは。
クライアントの例はLet's Boostに有るので、サーバの例を。コンパイルにはたぶんlibboost_system-*****(ビルドが必要)と通信ライブラリ(Windowsの場合winsock(MinGWの場合?はlibws2_32.a))が必要です。あとWindowsの場合、

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif

とかを最初に書く必要も有りますが、何も書かずにコンパイルするとエラーで何を書けばいいか教えてくれるみたいです。(上はXPの場合です。)

#include <iostream>
#include <string>
#include <boost/asio.hpp>
using namespace std;
using namespace boost::asio;

int main() {
	//ポート番号80で待ち受け
	io_service serv;
	ip::tcp::endpoint endp(ip::tcp::v4(), 80);
	ip::tcp::acceptor acc(serv, endp);
	
	ip::tcp::iostream s;
	acc.accept(*s.rdbuf());
	
	//受信
	string line;
	while( getline(s, line) ) {
		if(line == "\r" || line == "")
			break;
		cout << line << endl;
	}
	
	//送信
	s << "hello!" << endl;
	
	return 0;
}

このプログラムは

  • ポート番号80で接続を待ち受ける
  • \r\nまたは\nのみの行が来るまで受信を行い、標準出力に出力する(\nはgetlineが消去している)
  • hello!と送信する

というものです。
なのでLet's Boostの例の"www.boost.org"を"localhost"に変えたものと、この例の両方を実行するとそのまま通信の様子を見ることが出来たりします。