1. 通过RPC服务来实现远程计算服务,也就是说,服务器端提供的是计算器功能,客户端就请求计算器为我们来计算。这样就是PRC的大致原理。
2. 要利用RPC实现远程计算服务,首先就得编写idl文件,里面定义的是一个借口,以及定义的方法,然后再编写MathServicer.acf配置文件。
MathServicer.idl里面的代码如下:
[
uuid("4556509F-618A-46CF-AB3D-ED736ED66477"),// genurate by GUIDGen.exe
version(1.0)
]
interfaceMathServicer
{
int addition([in]int a,[in]int b);
int subduction([in]int a,[in]int b);
int multiplication([in]int a,[in]int b);
int division([in]int a,[in]int b);
}
MathServicer.acf文件中的内容如下:
[
implicit_handle(handle_t MathServicer_Binding)
]
interfaceMathServicer
{
}
然后使用midl命令对上面的MathServicer.idl文件进行编译,然后就会产生一些文件,产生的文件如下:
然后就是编写服务器端代码,在编写服务器端的代码的时候把刚才产生的_s.c和.h文件加入到服务器端工程里面去。然后再编写服务器端文件,主要是实现idl文件中定义的接口方法。其中的代码如下:
#include <stdlib.h>
#include <stdio.h>
#include "MathServicer.h"
int addition(int a,int b)
{
return a + b;
}
int subduction(int a,int b)
{
return a - b;
}
int multiplication(int a,int b)
{
return a * b;
}
int division(int a,int b)
{
return a / b;
}
int main(int argc,char * argv[])
{
RpcServerUseProtseqEp((unsigned char *)"ncacn_np", 20,(unsigned char *)"\\pipe\\{8dd50205-3108-498f-96e8-dbc4ec074cf9}",NULL);
RpcServerRegisterIf(MathServicer_v1_0_s_ifspec,NULL, NULL);
printf("服务已经启动....");
RpcServerListen(1,20,FALSE);
return 0;
}
void __RPC_FAR* __RPC_USERmidl_user_allocate(size_t len)
{
return(malloc(len));
}
void __RPC_USER midl_user_free(void __RPC_FAR *ptr)
{
free(ptr);
}
这样服务器端的代码就可以说是编写好了。
下面就是编写客户端的代码了,客户端主要就是对服务端的代码进行调用,其代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "MathServicer.h"
int main(int argc, char * argv[])
{
unsigned char * pszStringBinding = NULL;
RpcStringBindingCompose( NULL, (unsigned char*)"ncacn_np",NULL, (unsignedchar*)"\\pipe\\{8dd50205-3108-498f-96e8-dbc4ec074cf9}", NULL,&pszStringBinding );
RpcBindingFromStringBinding(pszStringBinding, & MathServicer_Binding);
RpcTryExcept
{
int a ,b;
char ch;
printf("RPC远程调用\n");
printf("请您依次输入一个整数a、一个运算符ch、一个整数b\n");
scanf("%d %c%d",&a,&ch,&b);
if(ch=='+')
printf("a + b = %d\n",addition(a,b));
else if(ch=='-')
printf("a - b = %d\n",subduction(a,b));
else if(ch=='*')
printf("a * b = %d\n",multiplication(a,b));
else if(ch=='/')
printf("a / b = %d\n",division(a,b));
else
printf("输入的运算符有误!!!\n");
}
RpcExcept(1)
{
printf( "RPC Exception %d\n", RpcExceptionCode() );
}
RpcEndExcept
RpcStringFree(&pszStringBinding);
RpcBindingFree(&MathServicer_Binding);
return 0;
}
void __RPC_FAR* __RPC_USERmidl_user_allocate(size_t len)
{
return(malloc(len));
}
void __RPC_USER midl_user_free(void__RPC_FAR *ptr)
{
free(ptr);
}
这样就可以实现客户端访问服务器端的计算功能了,下面就运行程序试试:
1. 首先是启动服务器端,运行的截图如下:
2. 下面就是运行客户端程序了,运行的截图如下:
3. 下面就是输入数据进行测试了,测试第一个数据:
4. 测试第二个数据:
5. 测试输入错误的情况:
这样经过我们的测试我们发现客户端可以实现远程调用服务器端的运算功能。