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 im Stub des Servers wiederholt aufrufen. Der MIDL-Compiler verwendet die IDL-Datei der Anwendung, um automatisch die Pushprozedur des Servers zu generieren.

Die Remoteserverroutine muss den Puffer der Ausgabepipe mit Daten füllen, bevor die Pushprozedur aufgerufen wird. 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);
 
}

Rohr

/Oi