inetdを利用してechoサーバを作ってみよう

前へ << inetdとは telnet の際の注意点 >> 次へ

inetdを使うと とっても楽

前節で説明したように、 inetdは
  • bind、listen、accept などの面倒なポート監視作業を受け持ってくれる
  • クライアントからの出力を標準入力に、標準出力をクライアントにリダイレクトしてくれる
という利点があります。

これがどれだけプログラマに楽をさせてくれることか。 下のプログラムは、inetd を利用した echo サーバです。

echo-server-inetd.pl

    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.
うーん、完璧ですね。すばらしい。

wait/nowait・ユーザ権限

では次に複数の 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を活用しよう

inetd を使うと非常に簡単にサーバが書けます。 httpd や sendmail のように反応速度を重要視するならともかく、 そうでないなら inetd を利用する方がいいでしょう。

ただ、inetd を使う場合は /etc/inetd.conf を編集する必要があるので、 root 権限を持たないホストでは管理者にお願いするしかありませんね。

前へ << inetdとは telnet の際の注意点 >> 次へ

ご意見・ご指摘は Twitter: @68user までお願いします。