0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Windowsの名前付きパイプにおける通信方向ごとの設定

Last updated at Posted at 2021-09-05

概要

Windowsの名前付きパイプは通信方向をINBOUND, OUTBOUND, DUPLEXの3種類が設定でき、サーバとクライアントの設定も通信方向で異なるのだが、これらの3パターンに対しての設定方法をわかりやすく設定した文献を見つけることができなかった。
そこで、試しなが少し苦労してパターンを理解したので、この記事では自分の理解をまとめて共有することとした。間違いなどがあればぜひ指摘いただきたい。

詳細

3種類のパターンを図にまとめると以下のようになった。
Windows名前付きパイプINBOUND-OUTBOUND-DUPLEX図解.png
ここではサーバはパイプを作成する側、クライアントはサーバの作成したパイプに繋ぐ側としている。以下ではそれぞれ個別の設定内容を説明する。

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_WRITEGENERIC_READをORにより両方設定する。

以上。

0
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?