查找终结点
服务器程序侦听客户端请求的终结点。 终结点字符串的语法取决于使用的协议序列。 例如,TCP/IP 的终结点是端口号,命名管道的终结点语法是有效的管道名称。
有两种类型的终结点:已知终结点和动态终结点。 你选择程序使用的终结点类型决定了是分布式应用程序还是运行时库指定终结点。
本部分讨论终结点,并提供有关如何查找它们的信息。 它按以下主题进行组织:
注意
术语静态终结点和已知终结点是等效的,可互换使用。
客户端应用程序可以使用终结点映射来确定服务器程序当前是否正在运行。 客户端可以调用 RpcMgmtInqIfIds、 RpcMgmtEpEltInqBegin 和 RpcMgmtEpEltInqDone ,以查看服务器是否已在终结点映射中注册了它所需的特定接口。
使用已知终结点
已知终结点是服务器程序每次运行时使用的预先分配的终结点。 由于服务器始终侦听该特定终结点,因此客户端始终尝试连接到该终结点。 已知终结点通常由负责传输协议的机构分配。 由于服务器主机具有有限数量的可用终结点,因此强烈建议应用程序开发人员使用已知的终结点。 动态终结点的另一个优点是,它们简化了系统的长期管理和维护。
分布式应用程序可以在字符串中指定已知终结点,并将该字符串作为参数传递给函数 RpcServerUseProtseqEp。 或者,终结点字符串可以作为 [ endpoint] 接口属性的一部分出现在 IDL 文件接口标头中。
可以使用两种方法来实现已知的终结点:
- 指定字符串绑定中的所有信息
- 将已知终结点存储在名称服务数据库中
开发绑定时,可以将建立绑定所需的所有信息写入分布式应用程序。 客户端可以直接在字符串中指定已知终结点,调用 RpcStringBindingCompose 以创建包含所有绑定信息的字符串,并将此字符串提供给函数 RpcBindingFromStringBinding 以获取句柄。 客户端和服务器可以硬编码以使用已知的终结点,也可以编写,以便终结点信息来自命令行、数据文件、配置文件或 IDL 文件。
客户端应用程序还可以查询名称服务数据库以获取已知的终结点信息。
使用动态终结点
特定服务器和特定协议序列的终结点数通常受到限制。 例如,使用 ncacn_ip_tcp 协议序列时,指示使用 TCP/IP 进行 RPC 网络通信, (大多数系统打开的端口范围只有 1025 到 5000) ,则只有有限数量的端口可用。 RPC 运行时库允许根据需要动态分配终结点。 由于可能的接口 UUID 数量几乎不受限制,因此使用接口 UUID 来直接调用可提供更大的扩展空间和更大的灵活性。
默认情况下,RPC 运行时库函数在查询名称服务数据库时搜索终结点信息。 如果终结点是动态的,则名称服务数据库将不包含终结点信息。 但是,查询将为客户端程序提供服务器的名称。 然后,它可以搜索服务器的终结点映射。
如果客户端需要使用动态终结点进行远程过程调用,首选方法是对部分绑定的绑定句柄进行调用。 RPC 运行时以透明方式解析终结点。 此方法优于使用 RpcEpResolveBinding 函数,因为它允许在 RPC 运行时使用高级缓存机制。
如果需要对终结点选择进行更具体的控制,客户端可以通过调用 RpcMgmtEpEltInqBegin、RpcMgmtEpEltInqNext 和 RpcMgmtEpEltInqDone 函数,一次搜索一个终结点映射条目。
将已知终结点导出到终结点映射数据库
可以混合这两种方法来查找终结点,尤其是在分布式系统从已知终结点模型过渡到动态终结点模型时。 在此类转换中,服务器的中间版本将使用已知终结点,但它也会将已知终结点注册到终结点映射数据库。 此方法允许使用已知终结点的客户端和使用动态终结点的客户端进行连接。 升级所有服务器后,可以部署仅使用动态终结点的新客户端版本。 升级所有客户端后,最终服务器版本可以停止使用已知终结点,并仅开始使用动态终结点。
此方法允许从已知终结点开始但想要迁移到动态终结点的应用程序提供转换路径,而无需同时更新所有服务器和客户端。