다음을 통해 공유


서버 애플리케이션

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

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

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

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

서버 애플리케이션에는 서버 스텁에서 호출하는 두 가지 메모리 관리 함수인 midl_user_allocatemidl_user_free 포함되어야 합니다. 이러한 함수는 원격 프로시저가 매개 변수를 서버에 전달하는 경우 서버에 메모리를 할당하고 해제합니다. 이 예제 프로그램에서 midl_user_allocatemidl_user_free 단순히 C-라이브러리 함수 malloc 에 대한 래퍼이며 무료입니다. (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);
}