Implementando pipes de saída no servidor
Para começar a receber dados de um servidor, um cliente chama um dos procedimentos remotos do servidor. Esse procedimento deve chamar repetidamente o procedimento push no stub do servidor. O compilador MIDL usa o arquivo IDL do aplicativo para gerar automaticamente o procedimento de push do servidor.
A rotina do servidor remoto deve preencher o buffer do pipe de saída com dados antes de chamar o procedimento de push. Sempre que o programa de servidor invoca o procedimento push em seu stub, o procedimento de push faz marshaling dos dados e os transmite para o cliente. O loop continua até que o servidor envie um buffer de comprimento zero.
O exemplo a seguir é do programa Pipedemo contido nos exemplos que vêm com o SDK do Windows. Ele ilustra um procedimento de servidor remoto que usa um pipe para enviar dados por push do servidor para o 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);
}
Tópicos relacionados