ipmsg.pl - Perl IP Messenger

Perl 5 によるネットワークプログラミングの習作として、題材として手軽な IP Messenger を作成しました。IP Messenger は UDP で通信を行ないます。Perl で実装するなら、Socket パッケージの socket, send, recv を使えば、IP Messenger とのやりとりが実現できます。ここで紹介しているソースリストは、習作としては少々複雑になってしまいましたが、IP Messenger プロトコルのほとんどのコマンドを実行できます。

ここでの UDP による通信を Perl で行なう方法については、以下の文献を参考にしました。

  1. 斎藤、小山、前田、布施、「新Perlの国へようこそ」、13.10.2 節「UDP」、サイエンス社, 1996.
IP Messenger に関しては「IP Messenger 開発研究室」から得ることが出来るプロトコルバージョン1(ドラフト7版)を参考にしました。また、このプログラムの使用感としてはおそらく Text IP Messenger に近いと思いますが、こちらは実用化を強く目指しているものではなく、あくまで習作として手掛けました。

ソースファイル

使用例

<単発メッセージ送信>

標準入力を指定したアドレスに送信

here% cat | ipmsg.pl -T -t there
もうすぐ21世紀だよ。
来世紀もどうぞよろしく。
^D
here%
ターゲットアドレスを指定するオプション「-t」は省略可能ですが、その場合アドレスは、コマンドライン引数の最後尾でなければなりません。アドレスには「,」で区切って複数指定可能です(IPMSG_MULTICASTOPT)。アドレスに「all」と書いた場合は、メッセージをブロードキャストします(IPMSG_BROADCASTOPT)。そして、メッセージを投げつける「-T」オプションは、送り先に通達確認(IPMSG_SENDCHECKOPT)を要求しません。

ちなみに、環境変数LANGが「ja*」となっている場合にのみ jcode.pl により、IP Messenger で想定されているShift_JISコードへ変換されます。

標準入力を指定したアドレスに封書で送信

封書でメッセージを送信するには「-s」オプションを指定します。
here% echo 'ちょっとあれあれしといて' | ipmsg.pl -s -T there
here%
錠前付きの封書には「-k」オプションを指定します。

X IP Messenger にはアイコンも送信したい

アイコンつきでメッセージを送信するには「-i」オプションを指定します。
% ipmsg.pl -i ~/include/X11/bitmaps/oneko/awake.xbm -T there
あしたの予定はきぃまったかなぁー
^D


<往復メッセージ送受信>

指定したアドレスで動作中の IP Messenger のバージョン情報を取得

% ipmsg.pl -I there
message from foo@where at 2000年10月04日 (水) 13時41分42秒 JST
Win32版 Ver1.33
%
バージョン情報取得要求(IPMSG_GETINFO)を通達するオプション「-I」により、ターゲットアドレスの応答を受け次第、情報を表示し終了しますが、応答がない場合は数秒待った後、何も表示せずに終了します。ターゲットアドレスを省略することで自分自身 localhost とやり取りします。
here% ipmsg.pl -I
message from me@here at 2000年10月04日 (水) 13時45分49秒 JST
ipmsg.pl 0.0 written by Taiji Yamada <taiji@aihara.co.jp>
here%

指定したアドレスで動作中の IP Messenger の不在通知文を取得

% ipmsg.pl -B there
message from foo@where at 2000年10月04日 (水) 13時50分43秒 JST
Not Absence mode
%
不在通知文取得要求(IPMSG_GETABSENCEINFO)を通達するオプション「-B」も上の例と同様に、メッセージの往復の通信で実現しています。

指定したアドレスで動作中の IP Messenger からホストリストを取得

上の例と同様な通信として、ホストリスト送出要求(IPMSG_GETLIST)を通達するオプション「-G」により、ターゲットアドレスで動作中の IP Messenger が保持しているホストリストを取得し、表示します。
% ipmsg.pl -G 192.168.0.21
message from somebody@somewhere at 2000年10月04日 (水) 14時12分23秒 JST
foo:where:0:192.168.0.5:2425:foo::
me:here:0:192.168.0.70:2425:me::
somebody:somewhere:0:192.168.0.21:2425:somebody::
he:there:0:192.168.0.23:2425:he::
ipmsg:server:0:192.168.0.67:2425:ipmsg:admin:
iam:home:0:192.168.0.66:2425:iam::
%

ホストリスト送出可能なメンバからホストリストを取得

さらに、ホストリスト送出可能メンバ探索同報(IPMSG_BR_ISGETLIST)を通達するオプション「-L」により、ホストリスト送出可能通知(IPMSG_BR_OKGETLIST)を応答してくれたところからホストリストを取得し、表示します。
% ipmsg.pl -L
message from ipmsg@server at 2000年10月04日 (水) 14時30分23秒 JST
foo:where:0:192.168.0.5:2425:foo::
me:here:0:192.168.0.70:2425:me::
somebody:somewhere:0:192.168.0.21:2425:somebody::
he:there:0:192.168.0.23:2425:he::
ipmsg:server:0:192.168.0.67:2425:ipmsg:admin:
iam:home:0:192.168.0.66:2425:iam::
%
但し通常は、ホストリスト送出可能通知を応答できるクライアントは見つからないでしょうから、このコマンドは自分自身で応答しようとします。しかし、上の例の場合、サービスにエントリ(IPMSG_BR_ENTRY)していないので、自分自身で保持するホストリストは空です。よって、以下のようにサービスにエントリしつつ数秒待った後に、ホストリスト送出可能メンバ探索同報を通知することにより、自分自身でホストリストの取得と表示を行なうことが出来ます。
here% ipmsg.pl -EL
message from me@here at 2000年10月04日 (水) 14時35分54秒 JST
foo:where:0:192.168.0.5:2425:foo::
me:here:0:192.168.0.70:2425:me::
somebody:somewhere:0:192.168.0.21:2425:somebody::
he:there:0:192.168.0.23:2425:he::
iam:home:0:192.168.0.66:2425:iam::
here%
この「-E」オプションによりサービスエントリ同報を行ないますが、このプロセスの終了時には、サービスを抜ける(IPMSG_BR_EXIT)ための同報が行なわれます。

<メッセージ受信>

「-r」オプションにより IP Messenger の通信プロトコルを受信します。下記は起動した ipmsg.pl でメッセージを受信した例です。
home% ipmsg.pl -E -r
message from me@here at 2000年10月04日 (水) 16時08分57秒 JST
もうすぐ21世紀だよ。
来世紀もどうぞよろしく。
下記は錠前付き封書のメッセージを受信した例です。
home% ipmsg.pl -E -r
message keyed from me@here at 2000年10月04日 (水) 16時13分40秒 JST
#1
一応、(他の実装と同様に)封書は即座に表示されないようになっています。これを開封(IPMSG_READMSG)するには、localhost からの制御メッセージで、封書の開封コマンド「-R」を受信する必要があります。以下はその例です。
home% echo '-R' | ipmsg.pl -T


home% ipmsg.pl -E -r
message keyed from me@here at 2000年10月04日 (水) 16時13分40秒 JST
#1
message keyed from me@here at 2000年10月04日 (水) 16時15分09秒 JST
ちょっとあれあれしといて
open #1
開封ではなく、封書の破棄コマンド「-D」を localhost から受信するとメッセージは破棄(IPMSG_DELMSG)されます。

「-r」オプションで起動したプロセスは、「Ctrl+C」などで終了する時に、サービスにエントリしているなら、サービスを抜けるための同報が行なわれます。

ホストリスト保持のためのプロセス

server% ipmsg.pl -EX -r
このように起動されたプロセスは、サービスに一旦はエントリするものの、数秒後には「-X」のオプションの効果により抜けてしまうので、他の IP Messenger の利用者たちには見えなくなります。これ以降は、ホストリスト送出要求をこのアドレスに対して通知すればよいでしょう。但し、このアドレスで他の IP Messenger は起動できません。


このサイトに関するご意見ご要望は taiji@aihara.co.jp までお願いします。

Copyright (C) 2000 Taiji Yamada, All rights reserved.