`
shake863
  • 浏览: 637385 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux下编程学习----- 远程过程调用(rpc)

阅读更多

一、概述

在传统的编程概念中,过程是由程序员在本地编译完成,并只能局限在本地运行的一段代码,也即其主程序和过程之间的运行关 系是本地调用关系。因此这种结构在网络日益发展的今天已无法适应实际需求。总而言之,传统过程调用模式无法充分利用网络上其他主机的资源(如CPU、 Memory等),也无法提高代码在实体间的共享程度,使得主机资源大量浪费。
而本文要介绍的RPC编程,正是很好地解决了传统过程所存在的一系列弊端。通过RPC我们可以充分利用非共享内存的多处 理器环境(例如通过局域网连接的多台工作站),这样可以简便地将你的应用分布在多台工作站上,应用程序就像运行在一个多处理器的计算机上一样。你可以方便 的实现过程代码共享,提高系统资源的利用率,也可以将以大量数值处理的操作放在处理能力较强的系统上运行,从而减轻前端机的负担。
二、RPC的结构原理及其调用机制

如前所述RPC其实也是一种C/S的编程模式,有点类似C/S Socket 编程模式,但要比它更高一层。当我们在建立RPC服务以后,客户端的调用参数通过底层的RPC传输通道,可以是UDP,也可以是TCP(也即TI-RPC —无关性传输),并根据传输前所提供的目的地址及RPC上层应用程序号转至相应的RPC Application Porgramme Server ,且此时的客户端处于等待状态,直至收到应答或Time Out超时信号。具体的流程图如图1。当服务器端获得了请求消息,则会根据注册RPC时告诉RPC系统的例程入口地址,执行相应的操作,并将结果返回至客 户端。
 当一次RPC调用结束后,相应线程发送相应的信号,客户端程序才会继续运行。

当然,一台服务主机上可以有多个远程过程提供服务,那么如何来表示一个唯一存在的远程过程呢?一个远程过程是有三个要素 来唯一确定的:程序号、版本号和过程号。程序号是用来区别一组相关的并且具有唯一过程号的远程过程。一个程序可以有一个或几个不同的版本,而每个版本的程 序都包含一系列能被远程调用的过程,通过版本的引入,使得不同版本下的RPC能同时提供服务。每个版本都包含有许多可供远程调用的过程,每个过程则有其唯 一标示的过程号。
三、基于RPC的应用系统开发
通过以上对RPC原理的简介后,我们再来继续讨论如何来开发基于RPC的应用系统。一般而言在开发RPC时,我们通常分为三个步骤:
a、定义说明客户/服务器的通信协议。
这里所说的通信协议是指定义服务过程的名称、调用参数的数据类型和返回参数的数据类型,还包括底层传输类型(可以是 UDP或TCP),当然也可以由RPC底层函数自动选择连接类型建立TI-RPC。最简单的协议生成的方法是采用协议编译工具,常用的有Rpcgen,我 会在后面实例中详细描述其使用方法。
b、开发客户端程序。
c、开发服务器端程序。
开发客户端和服务器端的程序时,RPC提供了我们不同层次的开发例程调用接口。不同层次的接口提供了对RPC不同程度控制。一般可分为5个等级的编程接口,接下来我们分别讨论一下各层所提供的功能函数。
1、简单层例程
简单层是面向普通RPC应用,为了快速开发RPC应用服务而设计的,他提供了如下功能函数。

函数名

功能描述

Rpc_reg( )

在一特定类型的传输层上注册某个过程,来作为提供服务的 RPC 程序

Rpc_call( )

远程调用在指定主机上指定的过程

Rpc_Broadcast( )

向指定类型的所有传输端口上广播一个远程过程调用请求

2、高层例程
在这一层,程序需要在发出调用请求前先创建一个客户端句柄,或是在侦听请求前先建立一个服务器端句柄。程序在该层可以自由的将自己的应用绑在所有的传输端口上,它提供了如下功能函数。

函数名

功能描述

Clnt_create( )

程序通过这个功能调用,告诉底层 RPC 服务器的位置及其传输类型

Clnt_create_timed( )

定义每次尝试连接的超时最大时间

Svc_create( )

在指定类型的传输端口上建立服务器句柄,告诉底层 RPC 事件过程的相应入口地址

Clnt_call()

向服务器端发出一个 RPC 调用请求

3、中间层例程
中间层向程序提供更为详细的RPC控制接口,而这一层的代码变得更为复杂,但运行也更为有效,它提供了如下功能函数。

函数名

功能描述

Clnt_tp_create( )

在指定的传输端口上建立客户端句柄

Clnt_tp_create_timed( )

定义最大传输时延

Svc_tp_creaet( )

在指定的传输端口上建立服务句柄

Clnt_call( )

向服务器端发出 RPC 调用请求

4、专家层例程
这层提供了更多的一系列与传输相关的功能调用,它提供了如下功能函数。

函数名

功能描述

Clnt_tli_create( )

在指定的传输端口上建立客户端句柄

Svc_tli_create( )

在指定的传输端口上建立服务句柄

Rpcb_set( )

通过调用 rpcbind RPC 服务和网络地址做映射

Rpcb_unset( )

删除 rpcb_set( ) 所建的映射关系

Rpcb_getaddr( )

调用 rpcbind 来犯会指定 RPC 服务所对应的传输地址

Svc_reg( )

将指定的程序和版本号与相应的时间例程建起关联

Svc_ureg( )

删除有 svc_reg( ) 所建的关联

Clnt_call( )

客户端向指定的服务器端发起 RPC 请求

5、底层例程
该层提供了所有对传输选项进行控制的调用接口,它提供了如下功能函数。

函数名

功能描述

Clnt_dg_create( )

采用无连接方式向远程过程在客户端建立客户句柄

Svc_dg_create( )

采用无连接方式建立服务句柄

Clnt_vc_create( )

采用面向连接的方式建立客户句柄

Svc_vc_create( )

采用面向连接的方式建立 RPC 服务句柄

Clnt_call( )

客户端向服务器端发送调用请求

............引用文字未尽,详细请参见 http://www.yuanma.org/data/2006/0918/article_1560.htm

分享到:
评论

相关推荐

    Linux网络编程

    第一章概论 ..............1 1.1 网络的历史...1 1.2 OSI 模型.......3 1.3 Internet 体系模型.............4 1.4 客户/服务器模型................12.3 传统过程调用和远程过程调用的比较.....250 12.4 远程过程调用的...

    Linux.C高级程序员指南

    第三部分(第11~19章)重点讨论了TCP/IP网络、套接字编程、客户机服务器编程、复杂服务器设计、远程过程调用(RPC)和RPC认证。第四部分(第20~26章)重点讨论了GTK图形界面编程。本书内容翔实,不管是Linux普通用户,...

    linux 网络编程源代码

    1.5 Linux 的发展.................................................................................................. 11 1.5.1 Linux 的发展历史 ..............................................................

    网络编程教程,很好的一本写linux网络编程书,这是我上传的源码

     第十二章 BPC远程过程调用原理和实践  12.1 RPC的原理  12.1.1 XDR的更进一步  12.1.2 本地函数调用的过程  12.1.3 用远程调用来虚拟本地调用  12.2 RPC的实现  12.2.1 远程过程的标识  ...

    入门学习Linux常用必会60个命令实例详解doc/txt

    要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。 不同Linux发行版的命令数量不一样,但Linux发行版本最少的命令也有200多个。这里笔者把比较重要和使用频率最多的命令...

    本项目旨在基于C++语言实现一个RPC分布式网络通信框架项目,使用CMake在Linux平台上构建编译环境。

    它可以将任何单体架构系统的本地方法调用重构为基于TCP网络的RPC远程方法调用。该框架实现了同一台机器的不同进程之间或不同机器之间的服务调用。它适用于将单体架构系统拆….zip 源码是经过本地编译可运行的,下载...

    Linux网络编程.pdf socket tcp udp

    1.5 Linux 的发展.................................................................................................. 11 1.5.1 Linux 的发展历史 ............................................................

    基于C++语言开发的分布式网络通信框架,利用CMake构建编译环境,主要在Linux平台上运行。

    该框架的核心目标是将原本基于单体架构的系统,通过RPC(远程过程调用)机制,转变为具备分布式微服务架构的形式。.zip 适合学习/练手、毕业设计、课程设计、期末/期中/大作业、工程实训、相关项目/竞赛学习等。 ...

    UNIX网络编程 第2卷 进程间通信 pdf

    本书全面深入地讲述了各种进程间通信(IPC)形式,它们是几乎所有复杂精致的UNIX程序的性能之关键。...有名共享内存区)及远程过程调用(Solaris门、Sun RPC)。在附录中给出了测量各种IPC形式之性能的方法。

    java开源包1

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    UNIX网络编程第一卷

    全面深入地介绍了4种IPC形式:消息传递(管道、FIFO、消息队列)、同步(互斥锁、条件变量、读写锁、文件与记录锁、信号量)、共享内存(匿名共享内存、具名共享内存)及远程过程调用(Solaris门、Sun RPC)。

    UNIX网络编程,第2卷:进程间通信(第二版)

    全面深入地介绍了4种IPC形式:消息传递(管道、FIFO、消息队列)、同步(互斥锁、条件变量、读写锁、文件与记录锁、信号量)、共享内存(匿名共享内存、具名共享内存)及远程过程调用(Solaris门、Sun RPC)。附录中给出了...

    计算机网络黑客防范措施-计算机安全论文-计算机论文.docx

    比如Windows里的远程过程调用RPC漏洞和Linux下的缓冲区溢出等。 1.3软件方面 再好的软件都有漏洞和软件编程者预留的"后门",都成为软件自身安全的隐患。 计算机网络黑客防范措施-计算机安全论文-计算机论文全文共5页...

    UNIX网络编程 卷2 进程间通信 带完整书签,完整目录

    第五部分 远程过程调用 285 第15章 门 286 15.1 概述 286 15.2 door_call函数 291 15.3 door_create函数 292 15.4 door_return函数 293 15.5 door_cred函数 294 15.6 door_info函数 294 15.7 例子 295 15.8...

    Python访问Mysql数据库

    Python 既支持面向过程的编程也支持面向对象的编程。在 面向过程的语言中,程序是由过程或仅仅是可重用代码的函数 构建起来的。在面向对象的语言中,程序是由数据和功能组合 而成的对象构建起来的。与其他主要的语言...

    java开源包10

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    JAVA上百实例源码以及开源项目源代码

     各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,UDP  基于JAVA的UDP服务器模型源代码...

    java开源包11

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

    java开源包2

    brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...

Global site tag (gtag.js) - Google Analytics