前へ << inetdとは | telnet の際の注意点 >> 次へ |
これがどれだけプログラマに楽をさせてくれることか。 下のプログラムは、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: }これだけです。ソケットもポートも、面倒なことはな〜んにも出てきません。 標準入力から読み込んで、それを標準出力に書き出しているだけです。
では実際に動かしてみましょう。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 サーバはマルチスレッドに対応しているのです。 どうしてかというと、/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 を使う場合は /etc/inetd.conf を編集する必要があるので、 root 権限を持たないホストでは管理者にお願いするしかありませんね。
前へ << inetdとは | telnet の際の注意点 >> 次へ |
ご意見・ご指摘は Twitter: @68user までお願いします。