IP Messenger プロトコルメモ.



用語

IP Messenger - DialUp ホスト

IP Messenger

特に断りがない限り、白水氏が作成された IP Messenger for Win32 を意味します。

DialUp ホスト

DialUp 接続をしているホストという意味ではなく、IP Messenger の設定で「DialUp接続」にチェックが入っているホストの事を意味します。プロトコル的には、IPMSG_DIALUPOPT ( メンバ認識系のコマンドを個別に送り返す ) があるホストです。


実装メモ

IP Messenger コマンドフォーマット - パケットの一意性 - IP Messenger 起動・更新時のエントリ動作 - HostList について

IP Messenger コマンドフォーマット

1) コマンド(フォーマットバージョン1)
Ver(1) : Packet番号 : 自User名 : 自Host名 : Command番号 : 追加部

2) 現在のコマンドフォーマットによるメッセージの送信文字列例
"1:100:shirouzu:jupiter:32:Hello"

パケットの一意性

パケットの一意性は、
パケット番号:IPアドレス:ソースポート
の組で判断します。
たとえ、バケット番号と IP アドレスが同じでも、ソースポートが異なれば、別パケットとみなされます。

IP Messenger 起動・更新時のエントリ動作

BroadCast アドレスが設定されていない場合、
1. 255.255.255.255 へ IPMSG_BR_ENTRY を送信。

BroadCast アドレスが設定されている場合、
1. 255.255.255.255 へ IPMSG_BR_ENTRY を送信。
2. BroadCast アドレスが設定されている場合、そのアドレスへ IPMSG_BR_ENTRY を送信。起動時や更新時の Entry 動作は 5 秒間隔で 2 度行われる。

※複数回 IPMSG_BR_ENTRY 送信を抑止するには、レジストリの ExtendEntry を 0 にします。

IPMSG_BR_ISGETLIST2 を参照して下さい。

HostList について

HostList を送受信する - HostList の送信 - HostList フォーマット
HostList は IP Messenger for Win32 のメッセージ送信ウィンドウの上側にあるユーザ一覧の事です。
これをあるホストに要求して受信し自分のホストリストに加える事で、相手が知っているホストと同じリスト ( ユーザ一覧 ) を得ることができます。
つまり自分が知らないホストがあったとしても、他のホストが知っていれば、そのホストからホストリストをもらう事で、自分も知らないホストの存在を知ることができます。

HostList を送受信する

IP Messenger は基本的にホストリスト要求は行ないませんが、起動時・更新時にホストリストを要求することも出来ます。
IPMSG_BR_ISGETLIST2 の項を参照して下さい。

流れとしては、
1.IPMSG_BR_ISGETLIST2 ホストリスト送出可能メンバの探索 ( ブロードキャスト )
2.IPMSG_OKGETLIST ホストリスト送出可能通知 ( 相手に返信 )
3.IPMSG_GETLIST ホストリスト送出要求 ( ホストリストを送ってもらう )
4.IPMSG_ANSLIST ホストリスト送出 ( 1回で送りきれなければ continue flag を付けて送信 )
5.IPMSG_GETLIST 次のホストリスト送出要求 ( IPMSG_ANSLIST に continue flag が付いていれば )
6.IPMSG_ANSLIST 次のホストリスト送出 ( また 1回で送りきれなければ continue flag を付けて送信 )

\HKEY_CURRENT_USER\Software\HSTools\IPMsg\ListGetMSec に設定されている時間 ( msec ) 以内に IPMSG_OKGETLIST や IPMSG_ANSLIST が相手から返信されてくる必要があります。

HostList の送信

HostList は相手からの IPMSG_GETLIST コマンドの返信として返されます。
HostList 交換は、IPMSG_GETLIST 要求を出すと相手側が IPMSG_ANSLIST コマンドで HostList を返してきます。HostList が1回の送信で終わらない場合 ( 登録されているホストが大量の場合 ) 複数回 IPMSG_GETLISTIPMSG_ANSLIST のやりとりが行われます。

HostList フォーマット


先頭から
続きのホスト番号:送信するホスト数:
ユーザ名:ホスト名:コマンド番号:IP アドレス:ポート番号(リトルエンディアン):ニックネーム:グループ名
の順番で並んでいます。

ex)
101: 100:
user1:host1:65536:192.168.0.0:30985:NickName1:Group1:
user2:host2:65536:192.168.0.1:30985:NickName2:Group2:
:
user100:host100:65536:192.168.0.100:30985:NickName100:Group100:

先頭5バイトは、続きのホストの番号です。( continue_cnt )
次の5バイトは、今回送信したホストの数です。( host_cnt )
どちらも右詰めで空いている桁は半角空白で埋めます。

※ここでは表示の都合上改行してありますが、実際には続いている文字列です。

HostList の文字列にはデリミタとして \a が標準で使用されます。( ここでは ":" をデリミタにしています。 )
HostList で文字列が指定されない場合 ( 例・グループ名が無い場合 ) \b が標準で使用されます。


プロトコルメモ

IPMSG_BR_ISGETLIST2 - IPMSG_GETLIST - IPMSG_ANSLIST - IPMSG_SENDMSG+IPMSG_SENDCHECKOPT

IPMSG_BR_ISGETLIST2


IP Messenger は基本的にホストリスト要求は行ないませんが、レジストリにある
\HKEY_CURRENT_USER\Software\HSTools\IPMsg\ListGet の値を 1 に ( default は 0 )
\HKEY_CURRENT_USER\Software\HSTools\IPMsg\AllowSendList の値を 1 に ( default で 1 )
する事でホストリストを他のホストに対し要求します。ホストリスト要求の流れは以下のようになります。

起動時や更新時に、
1. 255.255.255.255 へ IPMSG_BR_ISGETLIST2 を送信。
2. 1. の返答 IPMSG_OKGETLIST が無ければ、5秒後に IPMSG_BR_ISGETLIST2 を再送。
3. 255.255.255.255 へ IPMSG_BR_ENTRY を送信。

※2回目に送られる IPMSG_BR_ISGETLIST2 メッセージは、1回目のメッセージ送信の3秒後に IPMSG_RETRYOPT ( 再送フラグ( HOSTLIST 取得時に使用 )) が付けられる。

IPMSG_GETLIST

IPMSG_GETLIST ( ホストリスト送出要求 ) は相手のホストに対して HostList を要求するコマンドです。
このコマンドは以下のように送出されます。

ex)
"1:100:sender:sender-pc:18:0"

追加部に入っている数字は要求するホスト番号になります。ここの例では "0" が入っております。
この場合相手ホストはホストリストに入っている "0" 番目からのホストのリストを送出します。
仮に "10" が入っていた場合、10番目からのホストリストを送出します。

IPMSG_ANSLIST

HostList を送信するときは、コマンド番号 19 ( 0x13 : IPMSG_ANSLIST ) にして追加部に以下フォーマットの HostList を追加して送信します。

IPMSG_SENDMSG+IPMSG_SENDCHECKOPT

IPMSG_SENDMSG に IPMSG_SENDCHECKOPT が付いたメッセージを受信した場合、送信元に IPMSG_RECVMSG を返信する。
この時、追加部に受信したパケット番号を付けて返信する。これによって IPMSG_RECVMSG を受信したホストはどのメッセージが受け取ってもらえたか判別することができる。

パケット番号は、何を使用してもよいが単純に time() 関数を使用する事は避ける。time() は 1秒間に 1インクリメントされるだけだが、メッセージは 1秒間に複数送信される可能性があるからである。


特殊操作

バージョン情報の取得 - 不在通知文の取得

バージョン情報の取得

IP Messenger for Windows 版で、取扱説明書には記述されておりませんが、クライアントのバージョン情報を取得する ( IPMSG_GETINFO ( IPMSG バージョン情報取得 ) を送信する ) 事ができます。

1. ホストリストからホスト情報を取得したいホストを選択する。
2. Ctrl + Shift + マウス右ボタンを押しながら、送信ボタンをクリックする。
3. 選択したホストへ IPMSG_GETINFO ( IPMSG バージョン情報取得 ) を送信します。
4. 選択したホストから IPMSG_SENDINFO ( IPMSG バージョン情報応答 ) が送られてきます。

不在通知文の取得

IP Messenger for Windows 版で、取扱説明書には記述されておりませんが、クライアントの不在通知文を取得する ( IPMSG_GETABSENCEINFO ( 不在通知文取得 ) を送信する ) 事ができます。

1. ホストリストからホスト情報を取得したいホストを選択する。
2. Ctrl + Shift を押しながら、送信ボタンをクリックする。
3. 選択したホストへ IPMSG_GETABSENCEINFO ( 不在通知文取得 ) を送信します。
4. 選択したホストから IPMSG_SENDABSENCEINFO ( 不在通知文応答 ) が送られてきます。


Last Updated : 2003-1-9

Copyright © 2003 Mikio Fukushima. All rights reserved.
http://www.cybercom.jp/~mikio/