※この項はかなりプログラマ向けです。

# 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 の方が余計な手間がかからなくていい、といったところか。



SSTP
SIPC.M
SIPC.N
SIPC.A

サーバタイプ
listen
listen
listen
session
到達限界
network 全体
local 全体
local 全体
bin のみ
権限
極小
最大
最大
最大
遅延
あり
なし
なし
なし
プラットフォーム依存
なし
あり
あり
あり
OS バージョン依存
なし
なし
NT のみ
なし

戻る