RPC 编程
使用 RPC编程是在客户机和服务器实体之间进行可靠通信的最强大、最高效的方法之一。它为在分布式计算环境中运行的几乎所有应用程序提供基础。
简介
任何 RPC 客户机-服务器程序的重要实体都包括 IDL 文件(接口定义文件)、客户机 stub、服务器 stub以及由客户机和服务器程序共用的头文件。客户机和服务器 stub 使用 RPC 运行时库通信。RPC运行时库提供一套标准的运行时例程来支持 RPC 应用程序。了解运行时例程的内部情况有助于进一步了解 RPC 编程。
在一般的应用程序中,被调用的过程在相同的地址空间中运行,并把结果返回给发出调用的过程。在分布式环境中,客户机和服务器在不同的机器上运行,客户端调用在服务器端运行的过程,并把结果发送回客户机。这称为远程过程调用(RPC),是 RPC 编程的基础。
使用 RPC 编程是在分布式环境中运行的客户机和服务器应用程序之间进行可靠通信的最强大、最高效的方法之一。
当客户机应用程序发出远程过程调用时,在两端的 RPC 运行时库的帮助下,客户机 stub 把与这个调用相关的信息通过网络传递给服务器stub。服务器stub 把所需的信息提供给服务器应用程序。服务器应用程序执行远程过程调用,然后使用 RPC 运行时库通过服务器 stub把结果传递给客户机 stub。最后,客户机 stub 把结果返回给客户机应用程序。stub 作为应用程序和 RPC运行时之间的接口,以两者可以理解的格式交换信息。
在开发客户机-服务器应用程序时,客户机和服务器首先应该就要交换的过程的声明和定义达成一致。这就是接口起的作用,接口维护客户机和服务器都认可的所有过程声明和数据类型。
我们把所有共用的声明和数据类型放在接口定义语言 (IDL)文件中,客户机和服务器将共享这个文件。我们在 IDL 文件中使用 UUID,以使之在网络上所有其他接口中保持惟一。UUID是一个惟一的随机数,是由 uuidgen 实用程序使用网络地址信息和系统时间生成的。
用 IDL 编译器编译 IDL 文件,生成客户机和服务器 stub 对象文件以及头文件。这个头文件包含共用的定义和过程。stub文件在远程过程调用期间作为应用程序和 RPC 运行时库之间的接口。头文件包含在客户机和服务器源代码文件中。用 C编译器分别编译客户机和服务器文件,生成对象文件。客户机对象文件和客户机 stub 文件与 RPC运行时库链接,生成客户机可执行程序。以相似的方式生成服务器可执行程序,如下图。
(句柄,是整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类对象中的不同的实例。)
本文中的常用术语
- 绑定信息:
它包含客户机和服务器之间使用的通信协议、服务器网络地址和运行服务器进程的端点(端口号)的相关信息。
- 绑定向量:
绑定向量是一组引用绑定信息的绑定句柄。
- 对象 UUID:
除了管理接口的详细信息之外,服务器应用程序还可以管理对象 UUID 引用的资源。与接口一样,服务器也可以公布对象UUID。客户机应用程序可以只导入对象 UUID。
- 入口点向量:
RPC 运行时维护一个协议 ID表以支持与协议相关的开关。它还提供一套与协议的调用、绑定、管理和连网方面相关的协议服务。每个服务表示为一个入口点。在每个入口点中,有一套可以使用的函数。
- 塔:
这是在名称服务数据库中存储绑定信息的形式。
- 协议序列:
协议序列代表 RPC 通信使用的网络协议。最常用的协议序列是 ncacn_ip_tcp 和 ncadg_ip_udp。
可以看到,每个协议序列中使用三个协议:
-
- NCACN/NCADG – 描述连接 (CN) / 无连接 (DG) 协议的网络通信体系结构
- IP – 描述地址
- TCP/UDP – 传输层协议
幕后发生的情况
- 服务器 RPC 应用程序初始化期间它会向 RPC运行时库注册接口。需要注册接口是因为,客户机在向服务器发出远程过程调用时,要检查它是否与服务器兼容。服务器创建绑定信息并把信息存储在名称服务数据库中,客户机可以访问这个数据库并寻找到服务器的连接信息。服务器如果使用动态端点,那么它把端点信息放在服务器系统上的本地端点映射数据库中。本地端点映射数据库用于存储在此主机上运行的RPC 服务器进程的所有端点。服务器启动,监听来自客户机的远程过程调用。
- 客户机发出远程过程调用,此时它会联系名称服务数据库,以寻找服务器系统的相关信息。RPC运行时库使用这些信息联系服务器系统上的本地端点映射数据库,了解服务器进程在哪个端点上监听到达的 RPC。
- 客户机找到服务器之后,客户机 stub 把远程过程调用和参数转换为服务器 stub可以理解的格式,然后交给客户机运行时,由客户机运行时通过网络传输这些信息。
- 服务器 RPC 运行时库接收到达的 RPC 调用,把它传递给服务器 stub,服务器 stub把它转换为服务器可以理解的格式。
- 执行 RPC 调用之后,服务器 stub 和服务器运行时把结果发送回客户机。
- 客户机 RPC 运行时接收执行结果,传递给客户机 stub,客户机 stub 再把它传递给客户机进程。客户机应用程序从客户机 stub接收结果并完成 RPC 调用。
本文的其余部分解释完成远程过程调用在客户端和服务器端上需要使用的例程。