パイプに名前をつけておくと、他のマシンでも接続することが可能です。
名前付パイプ関連の関数は次のようなものがあります。
lpNameには、パイプの名前を指定します。 このとき名前は「\\.\pipe\name」のような感じで指定します。「pipe」はこのまま使います。 「name」は自分で好きな名前を付けます。「.」はローカルマシンを表しますが、 他のマシンを指定したいときは、その名前を指定します。実際のプログラムでは「\」は 「\\」で表すので"\\\\.\\pipe\\name"となり、やたら円記号が多くなるので注意してください。HANDLE CreateNamedPipe( LPCTSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes );
dwOpenModeには、アクセス・同期・一括書き込み・セキュリティモードを指定します。
アクセスモードは、次のいずれかを指定します。
PIPE_ACCESS_DUPLEXは、パイプ内のデータをクライアント・サーバー間で両方向に流すことができます。
PIPE_ACCESS_INBOUNDは、クライアントからサーバーに限定します。
PIPE_ACCESS_OUTBOUNDは、サーバーからクライアントに限定します。
一括書き込み・同期同期モードは次の組み合わせで指定します。
FILE_FLAG_WRITE_THROUGHは、一括書き込みモードを有効にします。
パイプに書き込む関数は、書き込んだデータがリモートコンピュータ上にあるパイプのバッファに
格納されるまで制御を返しません。サーバー・クライアントが同一マシン上に有ったり、バイトタイプの
データでないときは意味がありません。
FILE_FLAG_OVERLAPPEDは、非同期モードを有効にします。読み取り、書き込み関数などは すぐに制御を戻します。
セキュリティモードは次の任意の組み合わせで指定します。
WRITE_DACは、呼び出し側はパイプの任意のACL(アクセスコントロールリスト)への書き込みの権利を有します。
WRITE_OWNERは、呼び出し側は、名前付パイプのオーナーへの書き込み権を有します。
ACCESS_SYSTEM_SECURITYは、呼び出し側は名前付パイプのシステムACLへの書き込み権を有します。
dwPipeModeには、パイプの種類、読み取りモード、待機モードを指定します。
PIPE_TYPE_BYTEはパイプの情報が、通常のバイナリを扱う方法で読み書きされ、バイト列として理解されます。
PIPE_TYPE_MESSAGEは1度に1文を取得する必要があるときなどに用います。
読み取りモードは次のいずれかで指定します。
PIPE_READMODE_BYTEはバイトストリームとしてデータを読みます。
PIPE_READMODE_MESSAGEはメッセージストリームとしてデータを読みます。
待機モードは次のいずれかを指定します。
PIPE_WAITは、ReadFile関数が読み取るデータが発生するまで, WriteFile関数はデータが
すべて書き込まれるまで, ConnectNamedPipe関数はクライアントに接続されるまで制御を返しません。
PIPE_NOWAITは上の関数はすぐに制御を返します。
nMaxInstancesはパイプに対して作成できるインスタンスの最大数を指定します。 1以上PIPE_UNLIMITED_INSTANCES以下で指定します。
nOutBufferSizeに出力バッファのバイト数を指定します。
nInBufferSizeに入力バッファのバイト数を指定します。
nDefaultTimeOutには、タイムアウト値をミリ秒単位で指定します。
lpSecurityAttributesには、SECURITY_ATTRIBUTES構造体へのポインタを指定します。
関数が成功するとサーバー端点のハンドルが返されます。失敗するとINVALID_HANDLE_VALUEが返されます。
サーバー側で、クライアントがパイプに接続してくるのを待ちます。クライアントでは、 CreateFile関数や、CallNamedPipe関数でパイプに接続します。BOOL ConnectNamedPipe( HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped );
hNamedPipeには、サーバー端点のハンドルを指定します。
lpOverlappedには、OVERLAPPED構造体へのポインタを指定します。
成功すると0以外の値が、失敗すると0が返されます。
クライアント側で、タイムアウト時間が経過するか、 サーバー側がConnectNamedPipe関数を呼び出すまで待機します。BOOL WaitNamedPipe( LPCTSTR lpNamedPipeName, DWORD nTimeOut );
lpNamedPipeNameには、名前付パイプの名前を指定します。
nTimeOutには、タイムアウト時間をミリ秒で指定します。あるいは次の いずれかを指定します。
NMPWAIT_USE_DEFAULT_WAITは、サーバーがCreateNamedPipe関数で指定した 値に設定します。
NMPWAIT_WAIT_FOREVERは指定したパイプが接続できるようになるまで制御を返しません。
ほかにもいろいろ関連した関数がありますが、基本的なものはこれくらいです。
さて、これだけ見ると簡単に名前付パイプを作ることができて、読み書きも楽そうに思われます。 しかし、実際にプログラムを作ってみるといろいろ面倒なことが起こります。 次回からは実際に名前付パイプを作ってみます。
Update 20/Dec/1999 By Y.Kumei