接口定义语言 (IDL) 用于在远程过程调用 (RPC) 中建立客户端和服务器之间的通信。它有很多变体,例如 Sun RPC、ONC RPC、DCE RPC 等。
基本上,您使用 IDL 来指定客户端和服务器之间的接口,以便 RPC 机制可以创建通过网络调用函数所需的代码存根。
RPC 需要使用 IDL 信息为客户端和服务器创建存根函数。它与 C 中的函数原型非常相似,但最终结果略有不同,如下图所示:
+----------------+
| Client |
| +----------+ | +---------------+
| | main | | | Server |
| |----------| | | +----------+ |
| | stub_cli |----(comms)--->| stub_svr | |
| +----------+ | | |----------| |
+----------------+ | | function | |
| +----------+ |
+---------------+
在此示例中,不是调用function
在同一个程序中,main
调用客户端存根函数(具有相同的原型function
)它负责打包信息并通过通信通道将其传输到另一个进程。
这可以是同一台机器,也可以是不同的机器,这并不重要——RPC 的优点之一是能够随意移动服务器。
在服务器中,有一个“侦听器”进程将接收该信息并将其传递到服务器。服务器的存根接收信息,将其解包并将其传递给实际函数。
然后,真正的函数执行它需要的操作并返回到服务器存根,该存根可以打包返回信息(返回代码和任何[out]
or [in,out]
变量)并将其传递回客户端存根。
然后客户端存根将其解压并将其传回main
.
实际细节可能略有不同,但该解释对于概念性概述来说应该足够了。
实际的 IDL 可能如下所示:
[ uuid(f9f6be21-fd32-5577-8f2d-0800132bd567),
version(0),
endpoint("ncadg_ip_udp:[1234]", "dds:[19]")
] interface function_iface {
[idempotent] void function(
[in] int handle,
[out] int *status
);
}
顶部的所有信息(例如,uuid
or endpoint
)基本上是用于连接客户端和服务器的网络信息。它的“核心”位于显示原型的界面部分。这允许 IDL 编译器构建function
客户端和服务器存根函数,用于编译和链接客户端和服务器代码以使 RPC 正常工作。
Microsoft 确实使用 IDL(我认为他们有一个 MIDL 编译器)来处理 COM 内容。我还使用过带有 MS 操作系统的第三方产品,包括 DCE 和 ONC RPC。