| 前へ << inetdとは | telnet の際の注意点 >> 次へ |
前節で説明したように、 inetdはという利点があります。
- bind、listen、accept などの面倒なポート監視作業を受け持ってくれる
- クライアントからの出力を標準入力に、標準出力をクライアントにリダイレクトしてくれる
これがどれだけプログラマに楽をさせてくれることか。 下のプログラムは、inetd を利用した echo サーバです。
1: #!/usr/local/bin/perl 2: 3: # $Id: echo-server-inetd.pl,v 1.1 2001/04/21 18:56:40 68user Exp $ 4: 5: $|=1; # バッファリングしない 6: while (<STDIN>){ 7: print "my echod: $_"; 8: }これだけです。ソケットもポートも、面倒なことはな〜んにも出てきません。 標準入力から読み込んで、それを標準出力に書き出しているだけです。inetd 内部の echod と区別しやすくするために、 レスポンスの先頭に「my echod:」という文字列を出力します。では実際に動かしてみましょう。root になって、 /etc/inetd.conf の
#echo stream tcp nowait root internalというコメントアウトされた部分をecho stream tcp nowait root /path/echo-inetd.pl echodと有効にして (/path/ の部分には、echo-inetd.pl の置いてあるディレクトリをフルパス表記してください)、# killall -HUP inetdで inetd の再起動をします。では telnet を使って接続してみましょう。% telnet localhost echo Trying 127.0.0.1... flushoutput character is 'off'. Connected to localhost. Escape character is '^]'. hoge my echod: hoge fuga my echod: fuga ^](Ctrlを押しながら ]) telnet> quit Connection closed.うーん、完璧ですね。すばらしい。
では次に複数の telnet を使って、同時に echo サーバに アクセスしてみてください。どうでしょう? どの telnet で文字列をタイプしても、即座にレスポンスが 返ってきます。つまりこの echo サーバはマルチスレッドに対応しているのです。 どうしてかというと、/etc/inetd.conf に
echo stream tcp nowait root /path/echo-inetd.pl echodと書きましたが、この「nowait」というのが鍵です。 nowait とすると、inetd は echo サーバがクライアントの 対応をしている間に新たな接続があると、並行して echo サーバを 起動します。もし /etc/inetd.conf に nowait ではなく wait と書くと、 一度にひとつのクライアントの相手しかできなくなります。 その間に接続してきたクライアントは、前のクライアントの接続が 切れるまで待たされます。また、
echo stream tcp nowait root /path/echo-inetd.pl echodの「root」というのは、echo-inetd.pl を root 権限で実行する ことを表しています。UNIX 上で むやみに root 権限でプロセスを動かすことは危険です。 echo サーバのようなroot 権限が必要ないプログラムは、 ユーザ権限の弱い nobody 権限などで動かせばいいでしょう。echo stream tcp nowait nobody /path/echo-inetd.pl echodと書けばいいことはわかりますね?
inetd を使うと非常に簡単にサーバが書けます。 httpd や sendmail のように反応速度を重要視するならともかく、 そうでないなら inetd を利用する方がいいでしょう。ただ、inetd を使う場合は /etc/inetd.conf を編集する必要があるので、 root 権限を持たないホストでは管理者にお願いするしかありませんね。
| 前へ << inetdとは | telnet の際の注意点 >> 次へ |