Windows RPC 원격 프로세스 호출(1): 기본

Windows 자체는 RPC 서버가 되도록 지원합니다.WindowsXP의 기본 RPC/tcpip 기능이 열리지 않아 gpedit를 실행해야 합니다.msc, 컴퓨터 설정 -> 관리 모듈 -> 시스템 -> 원격 프로세스 호출 -> 검증되지 않은 RPC에 사용... ->"시작됨"을 선택하고 "없음"을 선택합니다.
1단계: IDL(Interface Description Language, 인터페이스 설명 언어) 파일 작성
test.idl
[
     uuid("9B26A55E-6DCD-4988-B83C-C6171F1DF5AC"), 
     version(1.0)
]

interface HelloWorld  
{
     //  
     int intAdd(int x, int y);
}

옵션으로 제공되는 파일은 RPC 인터페이스를 구성하는 응용 프로그램 구성 파일(.acf)입니다.
test.acf
[
implicit_handle(handle_t test_Binding)
]
interface HelloWorld  
{
}

VC 또는 VS 명령줄에서 다음 명령을 실행하는 IDL 파일을 컴파일합니다.
midl test.idl
그리고 테스트가 발생합니다.h、test_c.c、test_s.c 몇 개의 파일, 각각 헤더 파일, 클라이언트 파일, 서버 사이드 파일입니다.
2단계: 서버 측 프로그램 작성
새 win32 컨트롤러 프로그램, 파일 서버 추가.c:
#include<windows.h>  
#include <stdlib.h>
#include <stdio.h>

#include "test.h"
int intAdd( int x, int y)
{
	printf("%d + %d = %d
", x, y, x+y); return x+y; } int main(int argc,char * argv[]) { // tcp ,13521 RpcServerUseProtseqEp((unsigned char *)"ncacn_ip_tcp", RPC_C_PROTSEQ_MAX_REQS_DEFAULT, (unsigned char *)"13521", NULL); // ,HelloWorld_v1_0_s_ifspec test.h RpcServerRegisterIf(HelloWorld_v1_0_s_ifspec, NULL, NULL); // , RpcServerListen(1,20,FALSE); return 0; } // , 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); }

메뉴 프로젝트 - 설정 - 링크 - 대상 모듈에 rpcrt4를 추가합니다.lib.
test.h、test_s.c 이 두 파일도 서버 프로젝트에 추가됩니다.
그리고 컴파일하면 실행할 수 있습니다.
3단계: 클라이언트 프로그램 작성
마찬가지로 프로젝트client를 구축합니다.
메뉴 프로젝트 - 설정 - 링크 - 대상 모듈에 rpcrt4를 추가합니다.lib.
test.h、test_c.c 이 두 파일도client 프로젝트에 추가됩니다.소스 파일 클라이언트 추가.c:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

#include "test.h"

int main()
{
	unsigned char * pszStringBinding = NULL;
	int x, y, rval;

	RpcStringBindingCompose(
		NULL,
		(unsigned char*)"ncacn_ip_tcp",
		(unsigned char*)"localhost" /*NULL*/,
		(unsigned char*)"13521",
		NULL,
		&pszStringBinding
		);

	//  ,  test.acf  , test_Binding
	RpcBindingFromStringBinding(pszStringBinding, & test_Binding );

	//  
	RpcTryExcept
	{
		while(1)
		{
			printf("Input two integer: ");
			scanf("%d %d", &x, &y);
			rval = intAdd(x, y); 
			printf("%d
", rval); } } RpcExcept(1) { printf( "RPC Exception %d
", RpcExceptionCode() ); } RpcEndExcept // RpcStringFree(&pszStringBinding); RpcBindingFree(&test_Binding); return 0; } // , 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); }

컴파일하여 실행하면 됩니다.
프로그램 기능:
클라이언트에서 정수 2개를 입력하면 서버가 합을 계산하고 되돌아옵니다.

좋은 웹페이지 즐겨찾기