サーバーでの出力パイプの実装
サーバーからのデータの受信を開始するために、クライアントはサーバーのリモート プロシージャのいずれかを呼び出します。 このプロシージャは、サーバーのスタブでプッシュ プロシージャを繰り返し呼び出す必要があります。 MIDL コンパイラは、アプリケーションの IDL ファイルを使用して、サーバーのプッシュ プロシージャを自動的に生成します。
リモート・サーバー・ルーチンは、プッシュ・プロシージャーを呼び出す前に、出力パイプのバッファーにデータを入れます。 サーバー・プログラムがそのスタブでプッシュ・プロシージャーを呼び出すたびに、プッシュ・プロシージャーはデータをマーシャリングしてクライアントに送信します。 ループは、サーバーが長さ 0 のバッファーを送信するまで続行されます。
次の例は、Windows SDK に付属するサンプルに含まれている Pipedemo プログラムの例です。 パイプを使用してサーバーからクライアントにデータをプッシュするリモート サーバープロシージャを示します。
void OutPipe(LONG_PIPE *outputPipe )
{
long *outputPipeData;
ulong index = 0;
ulong elementsToSend = PIPE_TRANSFER_SIZE;
/* Allocate memory for the data to be passed back in the pipe */
outputPipeData = (long *)malloc( sizeof(long) * PIPE_SIZE );
while(elementsToSend >0) /* Loop to send pipe data elements */
{
if (index >= PIPE_SIZE)
elementsToSend = 0;
else
{
if ( (index + PIPE_TRANSFER_SIZE) > PIPE_SIZE )
elementsToSend = PIPE_SIZE - index;
else
elementsToSend = PIPE_TRANSFER_SIZE;
}
outputPipe->push( outputPipe->state,
&(outputPipeData[index]),
elementsToSend );
index += elementsToSend;
} //end while
free((void *)outputPipeData);
}
関連トピック