いけむランド

はてダからやってきました

MultiServer

複数の port で待ち受けられるプログラムを簡単に書く方法を考えてみた。


PHP では socket で待ち受けする場合は無限ループ内で select 系の関数を使用して、一定時間毎に変化のあった socket を種類毎に処理するのが一般的なやり方らしい。
PEAR では Net_Server を使うことで、これをスマートに書くことができるが、コンストラクタで port を指定して、start() で無限ループに入るため、単一の socket でしか待ち受けできないプログラムしか実装できないように見える。

そこで select 系の関数のループで監視する socket の集合を外部から指定できるようにすれば良いと思って、実装してみた。

サンプルは以下のような感じになる。



onConnect() が接続時に、onData() がデータ取得時にそれぞれ呼ばれるため、それらを実装する。

実際にこのプログラムを動かしている間に他の端末から接続してみると複数の port で受けられていることがわかる。

$ telnet localhost 7743
Trying ::1...
Connected to localhost.
Escape character is '^]'.
abc

cbaConnection closed by foreign host.
$ telnet localhost 7744
Trying ::1...
Connected to localhost.
Escape character is '^]'.
abc
nop
Connection closed by foreign host.
$ 


気が向いたら、もうちょっと拡張する。