Implementieren von Ausgabepipes auf dem Server
Um mit dem Empfangen von Daten von einem Server zu beginnen, ruft ein Client eine der Remoteprozeduren des Servers auf. Diese Prozedur muss die Pushprozedur wiederholt im Stub des Servers aufrufen. Der MIDL-Compiler verwendet die IDL-Datei der Anwendung, um die Pushprozedur des Servers automatisch zu generieren.
Die Remoteserverroutine muss den Puffer der Ausgabepipe mit Daten füllen, bevor sie die Pushprozedur aufruft. Jedes Mal, wenn das Serverprogramm die Pushprozedur in seinem Stub aufruft, marshallt die Pushprozedur die Daten und überträgt sie an den Client. Die Schleife wird fortgesetzt, bis der Server einen Puffer der Länge 0 (null) sendet.
Das folgende Beispiel stammt aus dem Pipedemo-Programm, das in den Beispielen enthalten ist, die im Windows SDK enthalten sind. Es veranschaulicht eine Remoteserverprozedur, die eine Pipe verwendet, um Daten vom Server an den Client zu pushen.
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);
}