서버에서 출력 파이프 구현

서버에서 데이터 수신을 시작하기 위해 클라이언트는 서버의 원격 프로시저 중 하나를 호출합니다. 이 프로시저는 서버 스텁에서 푸시 프로시저를 반복적으로 호출해야 합니다. MIDL 컴파일러는 애플리케이션의 IDL 파일을 사용하여 서버의 푸시 프로시저를 자동으로 생성합니다.

원격 서버 루틴은 푸시 프로시저를 호출하기 전에 출력 파이프의 버퍼를 데이터로 채워야 합니다. 서버 프로그램이 스텁에서 푸시 프로시저를 호출할 때마다 푸시 프로시저는 데이터를 마샬링하고 클라이언트로 전송합니다. 루프는 서버가 길이가 0인 버퍼를 보낼 때까지 계속됩니다.

다음 예제는 Windows SDK와 함께 제공되는 샘플에 포함된 Pipedemo 프로그램에서 나온 것입니다. 파이프를 사용하여 서버에서 클라이언트로 데이터를 푸시하는 원격 서버 프로시저를 보여 줍니다.

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

파이프

/Oi