当前位置:软件学习 > 其它软件 >>

Windows RPC远程过程调用

Windows本身支持成为一个RPC服务器。WindowsXP上面默认的RPC/tcpip功能没有打开,必须运行gpedit.msc,计算机配置->管理模版->系统->远程过程调用->用于未验证的RPC...->选择"已启动",限定项选择"无"。

第1步:编写 IDL(Inte易做图ce Description Language,接口描述语言)文件

test.idl

[plain]

     uuid("9B26A55E-6DCD-4988-B83C-C6171F1DF5AC"),  
     version(1.0) 

 
inte易做图ce HelloWorld   

     // 我们定义的方法 
     int intAdd(int x, int y); 

一个可选的文件是应用程序配置文件(.acf),它的作用是对 RPC 接口进行配置:

test.acf

[plain]

implicit_handle(handle_t test_Binding) 

inte易做图ce HelloWorld   

编译 IDL 文件,在VC或VS命令行运行以下命令:
midl test.idl


然后,会产生test.h、test_c.c、test_s.c几个文件,分别是头文件、客户端文件、服务器端文件。

 

第2步:编写服务器端程序

新建win32控制端程序,添加文件server.c:

[cpp]
#include<windows.h>   
#include <stdlib.h> 
#include <stdio.h> 
 
#include "test.h" 
int intAdd( int x, int y) 

    printf("%d + %d = %d\n", x, y, x+y); 
    return x+y; 

 
int main(int argc,char * argv[]) 
{<span style="white-space:pre">   </span>// 采用tcp协议,13521端口 
    RpcServerUseProtseqEp((unsigned char *)"ncacn_ip_tcp", RPC_C_PROTSEQ_MAX_REQS_DEFAULT,  
        (unsigned char *)"13521", NULL);     
<span style="white-space:pre">    </span>// 注册,<span style="font-family: Arial; ">HelloWorld_v1_0_s_ifspec定义域头文件test.h</span> 
    RpcServerRegisterIf(HelloWorld_v1_0_s_ifspec, NULL, NULL); 
    // 开始监听,本函数将一直阻塞 www.zzzyk.com  
    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这2个文件也添加到server工程中。

 

然后,编译,即可运行。

 

第3步:编写客户端程序

同样地,建立一个工程client。


在菜单“工程”——“设置”——“链接”——“对象模块”中,添加rpcrt4.lib。

test.h、test_c.c这2个文件也添加到client工程中。

添加源文件client.c:
[cpp]
#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\n", rval); 
        } 
         
    } 
    RpcExcept(1) 
    { 
        printf( "RPC Exception %d\n", 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); 

编译运行,即可。

 

程序功能:

在client中,输入2个整数,那么server会计算其和,并返回。

 


摘自 hustspy1990

补充:软件开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,