Implementando pipes de entrada no servidor

Para começar a enviar dados para um servidor, um cliente chama um dos procedimentos remotos do servidor. Esse procedimento deve chamar repetidamente o procedimento de pull no stub do servidor. O compilador MIDL usa o arquivo IDL do aplicativo para gerar automaticamente o procedimento de pull do servidor.

Sempre que o programa de servidor invoca o procedimento de pull em seu stub, o procedimento de pull recebe blocos de dados do cliente. Ele desmarca os dados no buffer do servidor. O procedimento remoto do servidor pode processar esses dados de qualquer forma necessária. O loop continua até que o servidor receba um buffer de comprimento zero.

O exemplo a seguir é do programa Pipedemo contido nos exemplos que vêm com o SDK (Platform Software Development Kit). Ele ilustra um procedimento de servidor remoto que usa um pipe para efetuar pull de dados do cliente para o servidor.

//file: server.c (fragment)
#include uc_server.c
#define PIPE_TRANSFER_SIZE 100 /* Transfer 100 pipe elements at one time */
 
void InPipe(LONG_PIPE     long_pipe )
{
    long local_pipe_buf[PIPE_TRANSFER_SIZE];
    ulong actual_transfer_count = PIPE_TRANSFER_SIZE;
 
    while(actual_transfer_count > 0) /* Loop to get all 
                                        the pipe data elements */
    {
        long_pipe.pull( long_pipe.state,
                        local_pipe_buf,
                        PIPE_TRANSFER_SIZE,
                        &actual_transfer_count);
        /* process the elements */
    } // end while
} //end InPipe