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

# 概要

SIPC は Stand Inter Process Communication の略で、平たく言えばリモートコンソールである。Stand は常時 SIPC サーバとして稼動しており、SIPC クライアントからの接続を待っている。SIPC クライアントは好きな時にサーバに接続し、任意のコンソールコマンドを送り、結果を受け取ることができる。この構造により、SIPC を用いた外部プロセスは、あたかも Stand システムの一部を所有しているかのように振舞うことができる。

Named Pipe はソケットとは異なり、外部ネットワークから侵入することはできないので、SIPC サーバを起動しておくこと自体に特に危険はない。


# 技術的詳細

SIPC の通信に使われているのは、現在のところ PIPE_ACCESS_DUPLEX で作成された Named Pipe である。サーバは "Stand" の名称で Named Pipe を作成する。クライアントは当該 Named Pipe に接続しコマンドを送る。コマンドはサーバ側で実行され、結果が同じ Named Pipe を通してクライアント側に返却される。この動作を必要なだけ繰り返す。接続しておく必要がなくなったらクライアント側から切断する。


# 具体的な通信方法

SIPC クライアントをカプセル化したラッパー DLL sipc.dll と、そのソースコードを以下に示す。

バイナリ
ソースコード

DLL を用いても、ソースコードを流用しても、どちらでもよい。sipc.dll は自作のプログラムに添付する限り自由に再配布してよい。通信に必要な動作は主に 3つであり、sipc.dll も以下の 3つの関数をエクスポートしている。


int WINAPI Connect();

SIPC サーバとの接続を確立する。成功した場合 0、失敗した場合は非 0 が返る。

int WINAPI Disconnect();

SIPC サーバとの接続を切断する。成功した場合 0、失敗した場合は非 0 が返る。

int WINAPI Send(const char* command, char* result, const int len);

SIPC サーバにコマンドを送り、結果を得る。command にコマンドが入り、result がリザルトを受け取るためのバッファである。バッファの長さは len で申告される。Send 関数はブロッキング関数だが、SIPC は基本的に遅延はないので、シングルスレッドでも問題はない。成功した場合 0、失敗した場合は非 0 が返る。


クライアントの構造はシンプルであり、DLL がロードできるか、あるいは数行の Named Pipe コードが書ければ、どのような言語でも簡単に SIPC クライアントになることができる。



おまけ

Object Pascal では以下のコードで sipc.dll を静的リンクできる。

function Connect: integer; stdcall; external 'sipc.dll' name 'Connect';
function Disconnect: integer; stdcall; external 'sipc.dll' name 'Disconnect';
function Send(const command: pchar; result: pchar; const len: integer): integer; stdcall; external 'sipc.dll' name 'Send';

できれば VB や HSP 等における SIPC 実装法についてもう少し資料が欲しいところだが(書式が分からないので)それらは適宜追加ということにしておく。


# 実際の通信

全てのコマンド実行に対し何らかの戻り値が得られる。

関数を実行した場合、その戻り値が返る。基本的には、0 が正常終了、非 0 が異常終了である。ただし関数によっては特有の戻り値を持つ場合もある。

システム変数/定数を参照した場合、その値が返る。これはコンソール上に出るような装飾つきのメッセージ( -> sv_hoge is '4' のようなもの)ではない。シンプルにデータだけが返る(この場合 4 のみ)。従ってパース等の余計な手間は必要ない。

システム変数に代入を行った場合、その戻り値が返る。0 が正常終了、非 0 が異常終了である。

接続はサーバ側のリソースを消費し続ける行為であるから、接続は可能な限り短時間に留める。起動と同時に接続して終了まで切断しないようなコードはあまり質がいいとは言えない。


# bin ディレクトリへの格納

Stand ホームディレクトリ下の bin ディレクトリにプログラムを格納することで、Stand 本体のポップアップメニューからそれらをあたかも Stand システムの一部であるかのように起動できる。

この状態に持っていくために必要なコマンドは基本的に以下のような 1行だけである。

registerguimenu '設定(&R)' 'system bin\config\config.exe'

現時点でコピーは手動、しかも autoexec.txt の書き換えが必要ということで、非常にすっきりした実装ではあるが、あまり初心者向けとは言えない。


一応注意書きすると、bin への格納はあくまでも一つの形であって、SIPC を用いたプログラムは全て bin 内に収まらなくてはならない、ということではない。


# サーバの仕様

最大 8クライアントと同時に通信可能。


# SSTP と SIPC どちらを用いるべきか?

SSTP はインターネットを介してリモートマシンまで行くことができ、プラットフォームフリーだが、スクリプトないしエコーデータを送ることしかできない。SIPC はローカルマシンから出られず、Windows プラットフォームに依存しているが、全コマンドを自由に実行できる。

用途が被るのはローカルマシン上であるプロセスから Stand にスクリプトないしエコーデータを送りたい場合のみである。この時は SSTP を送っても SIPC で say を送っても変わらない。

まあ、好きな方を使えばいいんじゃないかと。

戻る