自制脐疗减肥配方:linux下编程学习----- 远程过程调用(rpc) - shake863 - Java...
一、概述
在传统的编程概念中,过程是由程序员在本地编译完成,并只能局限在本地运行的一段代码,也即其主程序和过程之间的运行关系是本地调用关系。因此这种结构在网络日益发展的今天已无法适应实际需求。总而言之,传统过程调用模式无法充分利用网络上其他主机的资源(如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_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( )
客户端向服务器端发送调用请求