Реализация выходных каналов на сервере

Чтобы начать получать данные с сервера, клиент вызывает одну из удаленных процедур сервера. Эта процедура должна многократно вызывать процедуру отправки в заглушку сервера. Компилятор 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);
 
}

Трубы

/Эй