使服务器在网络上可用

在服务器应用程序可以接受远程过程调用之前,它必须在网络上可用。 为此,服务器向 RPC 运行时指示它愿意接受对一个或多个协议序列的调用。 选择服务器应用程序支持的协议序列是一个重要的决策;不同的协议序列具有截然不同的功能。 预期在本地接收调用的服务器应使用 ncalrpc。 接受远程调用的服务器应使用 ncacn_ip_tcp。 服务器不应验证接收呼叫的协议序列是否为他们希望接收呼叫的协议序列。 有关详细信息,请参阅《对在同一进程中运行的其他 RPC 终结点保持警惕》。

下面的代码示例使用 ncacn_ip_tcp

大多数服务器程序使用网络上可用的所有协议序列。 为此,它们会调用 RpcServerUseProtseq 函数,如以下代码片段所示:

RPC_STATUS status;
status = RpcServerUseProtseq(
    L"ncacn_ip_tcp",
    RPC_C_PROTSEQ_MAX_REQS_DEFAULT,    // Protseq-dependent parameter
    NULL);                             // Always specify NULL here.

RpcServerUseProtseq 函数的第一个参数是协议序列。 第二个参数依赖于该协议序列。 如代码示例所示,大多数服务器程序将该参数设置为 RPC_C_PROTSEQ_MAX_REQS_DEFAULT。 该值会将 RPC 库设置为使用默认值。 第三个参数是安全描述符,不应在应用中使用。 有关详细信息,请参阅安全性 (RPC)

还可以调用 RpcServerUseAllProtseqsRpcServerUseProtseqExRpcServerUseProtseqEpRpcServerUseProtseqEpEx 函数。

服务器应用程序选择至少一个协议序列后,使用动态终结点的服务器必须为其使用的每个协议序列创建绑定信息。 服务器会将绑定信息存储在绑定向量中,然后它可以将其导出到终结点映射器服务。

使用 RpcServerInqBindings 函数获取服务器应用程序的绑定向量,如以下示例所示:

RPC_STATUS status;
RPC_BINDING_VECTOR *rpcBindingVector;
 
status = RpcServerInqBindings(&rpcBindingVector);

传递给 RpcServerInqBindings 函数的唯一参数是一个指针,它指向 RPC_BINDING_VECTOR 结构的指针。 RPC 运行时库会动态分配绑定向量数组,并将数组的地址存储在该参数变量中(在本例中为 rpcBindingVector)。 服务器应用使用完该绑定向量(例如,在将它传递给适当的函数)后,服务器应用将负责通过使用 RpcBindingVectorFree 函数释放该绑定向量。