※この項はかなりプログラマ向けです。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# SIPC 概要 SIPC は Stand Inter Process Communication の略で、平たく言えばリモートコンソールである。Stand は常時 SIPC サーバとして稼動しており、SIPC クライアントからの接続を待っている。SIPC クライアントは好きな時にサーバに接続し、任意のコンソールコマンドを送り、結果を受け取ることができる。この構造により、SIPC を用いた外部プロセスは、あたかも Stand システムの一部を所有しているかのように振舞うことができる。 SIPC サーバは外部ネットワークから侵入することはできないので、SIPC サーバを起動しておくこと自体にセキュリティ上の危険はない。 # 設計概要 SIPC の通信に使われているのは Mailslot である。サーバは "Stand" の名称で Mailslot を作成する。クライアントは当該 Mailslot に接続しコマンドを送る。コマンドはサーバ側で実行され、結果がクライアント指定の Mailslot を通してクライアント側に返却される。切断しない限り送受信は何度でも行える。必要がなくなったらクライアント側から切断を行う。 # コード SIPC クライアントをカプセル化したラッパー DLL sipc.dll と、そのソースコードを以下に示す。 バイナリ cpp h DLL を用いても、ソースコードを流用しても、どちらでもよい。sipc.dll は自作のプログラムに添付する限り自由に再配布してよい。通信に必要な動作は主に 3つであり、sipc.dll も以下の 3つの関数をエクスポートしている。 int WINAPI Connect(const char* name); SIPC サーバとの接続を確立する。name には自プロセスの固有の ID をセットする。これはローカルシステム上で唯一の名称でなくてはならず、もし運悪く同じ名称を持ったプロセスが既に存在していた場合、関数は失敗する。成功した場合 0、失敗した場合は非 0 が返る。 int WINAPI Disconnect(); SIPC サーバとの接続を切断する。成功した場合 0、失敗した場合は非 0 が返る。 int WINAPI Send(const char* command, char* result, const int len); SIPC サーバにコマンドを送り、結果を得る。command にコマンドが入り、result がリザルトを受け取るためのバッファである。バッファの長さは len で申告される。この関数を使用するには先に Connect 関数を呼んで接続を終えておく必要がある。Send 関数はブロッキング関数だが、SIPC は基本的に遅延はないので、シングルスレッドでも問題はない。成功した場合 0、失敗した場合は非 0 が返る。 クライアントの構造はシンプルであり、DLL がロードできるか、あるいは数行の Mailslot コードが書ければ、どのような言語でも簡単に SIPC クライアントになることができる。 # サンプル HSP での sipc.dll 動的リンク+通信コード (thx. whw) Ruby での sipc.dll 動的リンク+通信コード (thx. 慧光) Python での sipc.dll 動的リンク+通信コード (thx. mei) Visual Basic での sipc.dll 静的リンクコード (thx. Oriharn) Object Pascal での sipc.dll 静的リンクコード 他の言語についてもどこからか資料が貰え次第追記する。 # 設計 全てのコマンド実行に対し何らかの戻り値が得られる。 関数を実行した場合、その戻り値が返る。基本的には、0 が正常終了、非 0 が異常終了である。ただし関数によっては特有の戻り値を持つ場合もある。 システム変数/定数を参照した場合、その値が返る。これはコンソール上に出るような装飾つきのメッセージ( -> sv_hoge is '4' のようなもの)ではない。シンプルにデータだけが返る(この場合 4 のみ)。従ってパース等の余計な手間は必要ない。 システム変数に代入を行った場合、その戻り値が返る。0 が正常終了、非 0 が異常終了である。 接続は OS のリソースを消費し続ける行為であるが、実際それほどの消費はないと思われるので、接続管理はアバウトでよい。起動と同時に接続して終了まで切断しないようなコードはあまり行儀がいいとは言えないが、OS への負荷という面で見れば別にどうでもいいと思われる。 # bin ディレクトリへの格納 Stand ホームディレクトリ下の bin ディレクトリにプログラムを格納することで、Stand 本体のポップアップメニューからそれらをあたかも Stand システムの一部であるかのように起動できる。 この状態に持っていくために必要なコマンドは基本的に registerguimenu だけである。例示 registerguimenu '設定(&R)' 'system bin\config\config.exe' 現時点でコピーは手動、しかも autoexec.txt の書き換えが必要ということで、非常にすっきりした実装ではあるが、あまり初心者向けとは言えない。 一応注意書きすると、bin への格納はあくまでも一つの形であって、SIPC を用いたプログラムは全て bin 内に収まらなくてはならない、ということではない。 # サーバの仕様 最大クライアント数に制限はない。 # サーバの存在をどうやって判断するか? 接続前であれば、メールスロットの存在の有無、sipc.dll で言えば Connect の成否でサーバの存在を確認できる。しかしこれでは接続してしまってからサーバが勝手にいなくなった場合に対処できない。ので、結局存在の有無は Mutex を用いてチェックするのがよい。stand.exe は名称 Stand で起動から終了までミューテックスを保持している。 # SSTP と SIPC どちらを用いるべきか? SSTP はインターネットを介してリモートマシンまで行くことができ、プラットフォームフリーだが、スクリプトないしエコーデータを送ることしかできない。SIPC はローカルマシンから出られず、Windows プラットフォームに依存しているが、全コマンドを自由に実行できる。 用途が被るのはローカルマシン上であるプロセスから Stand にスクリプトないしエコーデータを送りたい場合のみである。この時は SSTP を送っても SIPC で say を送っても変わらない。あえて言えば、接続の瞬間にサーバ不在が分かる SIPC の方が余計な手間がかからなくていい、といったところか。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
戻る |