RPC远程过程调用

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.      测试输入错误的情况:


这样经过我们的测试我们发现客户端可以实现远程调用服务器端的运算功能。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值