tcp server

OTPなTCP serverってどうやって作るのだろうか、gen_serverはいまいち使えない気が、と思っていたら、http://www.trapexit.org/Building_a_Non-blocking_TCP_server_using_OTP_principlesチュートリアルが。gen_serverとgen_tcp:accept/1は相性が悪いので、prim_inet:async_accept/2を使ってgen_server:handle_info/2でacceptしたソケットを捕まえるということのよう。acceptしたらそれごとにスーパーバイザー付きのコネクションプロセスを生成してgen_tcp:controlling_process/2でソケットをそのプロセスに渡すみたい。コネクションプロセスではgen_fsmを使ってコマンドのやり取りで状態遷移して行くという。凄い。無通信でのタイムアウトの面倒とか、リスナが落ちた時の再起動とか全部やってくれる。