概要
Windowsの名前付きパイプは通信方向をINBOUND, OUTBOUND, DUPLEXの3種類が設定でき、サーバとクライアントの設定も通信方向で異なるのだが、これらの3パターンに対しての設定方法をわかりやすく設定した文献を見つけることができなかった。
そこで、試しなが少し苦労してパターンを理解したので、この記事では自分の理解をまとめて共有することとした。間違いなどがあればぜひ指摘いただきたい。
詳細
3種類のパターンを図にまとめると以下のようになった。
ここではサーバはパイプを作成する側、クライアントはサーバの作成したパイプに繋ぐ側としている。以下ではそれぞれ個別の設定内容を説明する。
OUTBOUNDの場合
OUTBOUNDはサーバがパイプに書き込んだデータをクライアントが受け取るという一方通行の通信を表す。
サーバはCreateNamedPipe()
を呼び出すときにPIPE_ACCESS_OUTBOUND
を設定する。サーバはデータを読まないためREADMODEは設定しない。
クライアントはCreateFile()
を呼び出す時にGENERIC_READ
を設定する。一般のファイルを読み込みモードで開くのと似ている。他のパターンではSetNamedPipeHandleState()
を呼び出すが、クライアントが書き込みを行わないOUTBOUNDの場合は不要である。(むしろ呼び出すとエラーが出る。)
INBOUNDの場合
INBOUNDはOUTBOUNDとは逆にクライアントがパイプに書き込んだデータをサーバが受け取るという一方通行の通信を表す。
サーバはCreateNamedPipe()
を呼び出すときにPIPE_ACCESS_INBOUND
を設定する。サーバはデータを読むためREADMODEを設定する。
クライアントはCreateFile()
を呼び出す時にGENERIC_WRITE
を設定する。INBOUNDのパターンではSetNamedPipeHandleState()
を呼び出す。これは推測だが書き込む側がどのような書き込みを行うかを決める設計になっているということかもしれない。
DUPLEXの場合
DUPLEXの設定はINBOUNDとOUTBOUNDの組み合わせである。クライアントはGENERIC_WRITE
とGENERIC_READ
をORにより両方設定する。
以上。