Реализация выходных каналов на сервере
Чтобы начать получать данные с сервера, клиент вызывает одну из удаленных процедур сервера. Эта процедура должна многократно вызывать процедуру отправки в заглушку сервера. Компилятор MIDL использует IDL-файл приложения для автоматического создания процедуры отправки сервера.
Подпрограмма удаленного сервера должна заполнить буфер выходного канала данными, прежде чем вызывать процедуру отправки. Каждый раз, когда серверная программа вызывает процедуру отправки в заглушку, процедура отправки маршалирует данные и передает их клиенту. Цикл продолжается до тех пор, пока сервер не отправит буфер нулевой длины.
Следующий пример является примером программы Pipedemo, содержащейся в примерах, которые поставляются с Windows SDK. В нем показана процедура удаленного сервера, использующая канал для отправки данных с сервера клиенту.
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);
}
Связанные темы