Implementación de canalizaciones de salida en el servidor

Para empezar a recibir datos de un servidor, un cliente llama a uno de los procedimientos remotos del servidor. Este procedimiento debe llamar repetidamente al procedimiento de inserción en el código auxiliar del servidor. El compilador MIDL usa el archivo IDL de la aplicación para generar automáticamente el procedimiento de inserción del servidor.

La rutina del servidor remoto debe rellenar el búfer de la canalización de salida con datos antes de llamar al procedimiento de inserción. Cada vez que el programa de servidor invoca el procedimiento de inserción en su código auxiliar, el procedimiento de inserción serializa los datos y los transmite al cliente. El bucle continúa hasta que el servidor envía un búfer de longitud cero.

El ejemplo siguiente procede del programa Pipedemo incluido en los ejemplos que vienen con Windows SDK. Ilustra un procedimiento de servidor remoto que usa una canalización para insertar datos desde el servidor al cliente.

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);
 
}

Pipa

/Oi