利用RPC实现远程计算服务(以加减乘除为例)

前期准备
确保VC++已经安装,并把其bin路径配置到环境变量path中。

1.使用IDL定义服务接口mathservice.idl, 定义计算服务操作,编写mathservice.idl文件,内容如下:

[
  uuid("4556509F-618A-46CF-AB3D-ED736ED66477"),//GUIDGen.exe
  version(1.0)
]

interface MathService
{
  int add([in]int a,[in]int b);
  int sub([in]int a,[in]int b);
  int multiply([in]int a,[in]int b);
  int div([in]int a,[in]int b);
}

2.编写配置文件mathservice.acf, 定义绑定句柄,文件内容如下:

[
    implicit_handle(handle_t MathService_Binding)
]

interface MathService
{
}

3.编译mathservice.idl文件
在命令提示符中进入上面文件所放的目录,执行“midl mathservice.idl”命令,将会自动生成mathservice.h,mathservice_c.c,mathservice_s.c三个文件
在命令行中编译mathservice.idl

生成的文件
生成的文件

4.编写服务端程序
在当前目录下(也可以更换目录)创建server文件夹,并将mathservice.h, mathservice_s.c拷贝到此文件夹中。并编写server.c,server.c内容如下:

#include<stdio.h>
#include<stdlib.h>
#include"mathservice.h"
int add(int a,int b){
    return a+b;
}
int sub(int a,int b){
    return a-b;
}
int multiply(int a,int b){
    return a*b;
}
int Div(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(MathService_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);
}

启动VC,创建win32-console Application空白工程server,工程路径设置为server文件夹路径,然后将mathservice.h, mathservice_s.c, server.c添加至工程中。
程序结构如下:
程序结构

添加RPC运行库rpcrt4.lib至工程。操作如下:
Project(工程)–> setting(设置) –> link (连接)–> Object/library modules(对象/库模块):
添加RPC运行库

编译连接工程,生成service.exe
service.exe

5.编写客户端程序
创建client文件夹,与server同级,将mathservice.h, mathservice_c.c拷贝到此文件夹中,并编写client.c,client.c内容如下:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"mathservice.h"

int main(int argc,char* argv[]){
    unsigned char* pszStringBinding=NULL;
    RpcStringBindingCompose(NULL,(unsigned char*)"ncacn_np", NULL,(unsigned char*)"\\pipe\\{8dd50205-3108-498f-96e8-dbc4ec074cf9}", NULL,&pszStringBinding);
    RpcBindingFromStringBinding(pszStringBinding, & MathService_Binding );
    RpcTryExcept{
        int flag = 1;
        int a,b;
        int ch;
        while(flag){
            printf("请输入两个整数,用空格分开:\n");

            scanf("%d%d",&a,&b);
            printf("请选择要进行的运算(1:相加   2:相减  3:相乘   4:相除   0:退出)\n");

            scanf("%d",&ch);
            switch(ch){
            case 1:printf("两个数的和为: %d\n",add(a,b));break;
            case 2:printf("两个数的差为: %d\n",sub(a,b));break;
            case 3:printf("两个数的积为: %d\n",multiply(a,b));break;
            case 4:printf("两个数的商为: %d\n",Div(a,b));break;
            case 0:flag=0;break;
            }
        }
    }
    RpcExcept(1){
        printf("RPC Exception %d\n",RpcExceptionCode());
    }
    RpcEndExcept
    RpcStringFree(&pszStringBinding);
    RpcBindingFree(&MathService_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);
}

启动VC,创建win32-console Application空白工程client,工程路径设置为client文件夹路径,然后将mathservice.h, mathservice_c.c, client.c添加至工程中。
程序结构如下:
程序结构

添加RPC运行库rpcrt4.lib至工程。操作如下:
Project(工程)–> setting(设置) –> link (连接)–> Object/library modules(对象/库模块):
添加RPC运行库

编译连接工程,生成client.exe
client.exe

6.测试运行
先启动server.exe,再启动client.exe
运行结果

在客户端输入内容进行计算
计算结果

  • 3
    点赞
  • 5
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

紫凯茗檬

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值