Implementazione delle pipe di output nel server

Per iniziare a ricevere dati da un server, un client chiama una delle procedure remote del server. Questa procedura deve chiamare ripetutamente la procedura push nello stub del server. Il compilatore MIDL usa il file IDL dell'applicazione per generare automaticamente la routine push del server.

La routine del server remoto deve riempire il buffer della pipe di output con i dati prima di chiamare la routine push. Ogni volta che il programma server richiama la routine push nello stub, la procedura push esegue il marshalling dei dati e li trasmette al client. Il ciclo continua fino a quando il server non invia un buffer di lunghezza zero.

L'esempio seguente è tratto dal programma Pipedemo contenuto negli esempi inclusi in Windows SDK. Illustra una routine del server remoto che usa una pipe per eseguire il push dei dati dal server al client.

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

Tubo

/Oi