다음을 통해 공유


서버 애플리케이션

아래 예제는 SDK(플랫폼 소프트웨어 개발 키트)의 RPC\Hello 디렉터리에 있는 'Hello World' 애플리케이션에서 가져옵니다. 분산 애플리케이션의 서버 쪽은 해당 서비스를 사용할 수 있음을 시스템에 알릴 수 있습니다. 그런 다음 클라이언트 요청을 기다립니다. MIDL 컴파일러는 아래 예제와 함께 사용해야 합니다.

애플리케이션의 크기 및 코딩 기본 설정에 따라 하나 이상의 별도 파일에서 원격 프로시저를 구현하도록 선택할 수 있습니다. 이 자습서 프로그램에서는 원본 파일 Hellos.c에 주 서버 루틴이 포함되어 있습니다. Hellop.c 파일에는 원격 프로시저가 포함되어 있습니다.

원격 프로시저를 별도의 파일로 구성하는 이점은 프로시저를 독립 실행형 프로그램과 연결하여 분산 애플리케이션으로 변환되기 전에 코드를 디버그할 수 있다는 것입니다. 프로시저가 독립 실행형 프로그램에서 작동하면 원격 프로시저가 포함된 원본 파일을 컴파일하고 서버 애플리케이션과 연결할 수 있습니다. 클라이언트-애플리케이션 원본 파일과 마찬가지로 서버-애플리케이션 원본 파일에 Hello.h 헤더 파일이 포함되어야 합니다.

서버는 RpcServerUseProtseqEpRPC 런타임 함수를 호출하고 RpcServerRegisterIf 호출하여 클라이언트에서 바인딩 정보를 사용할 수 있도록 합니다. 이 예제 프로그램은 인터페이스 핸들 이름을 RpcServerRegisterIf전달합니다. 다른 매개 변수는 NULL 설정됩니다. 그런 다음 서버는 RpcServerListen 함수를 호출하여 클라이언트 요청을 기다리고 있음을 나타냅니다.

또한 서버 애플리케이션에는 서버 스텁에서 호출하는 두 가지 메모리 관리 함수인 midl_user_allocatemidl_user_free포함되어야 합니다. 이러한 함수는 원격 프로시저가 매개 변수를 서버에 전달하는 경우 서버에 메모리를 할당하고 해제합니다. 이 예제 프로그램에서 midl_user_allocatemidl_user_free는 C 라이브러리 함수인 mallocfree에 대한 단순 래퍼입니다. (MIDL 컴파일러에서 생성된 전달 선언에서 "MIDL"은 대문자입니다. 헤더 파일 Rpcndr.h에서는 midl_user_free 및 midl_user_allocate를 각각 MIDL_user_free 및 MIDL_user_allocate로 정의합니다.)

/* file: hellos.c */
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "hello.h"
#include <windows.h>

void main()
{
    RPC_STATUS status;
    unsigned char * pszProtocolSequence = "ncacn_np";
    unsigned char * pszSecurity         = NULL; 
    unsigned char * pszEndpoint         = "\\pipe\\hello";
    unsigned int    cMinCalls = 1;
    unsigned int    fDontWait = FALSE;
 
    status = RpcServerUseProtseqEp(pszProtocolSequence,
                                   RPC_C_LISTEN_MAX_CALLS_DEFAULT,
                                   pszEndpoint,
                                   pszSecurity); 
 
    if (status) exit(status);
 
    status = RpcServerRegisterIf(hello_ServerIfHandle,  
                                 NULL,   
                                 NULL); 
 
    if (status) exit(status);
 
    status = RpcServerListen(cMinCalls,
                             RPC_C_LISTEN_MAX_CALLS_DEFAULT,
                             fDontWait);
 
    if (status) exit(status);
 }

/******************************************************/
/*         MIDL allocate and free                     */
/******************************************************/
 
void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
{
    return(malloc(len));
}
 
void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
{
    free(ptr);
}