指定端點
端點是遠端程序呼叫之伺服器進程的網路特定位址。 端點的實際名稱取決於所使用的通訊協定順序。 例如,TCP、UDP 和 HTTP 會使用埠。 具名管道會使用具名管道名稱。 用戶端/伺服器應用程式可以使用已知的端點或動態端點。 本節提供伺服器程式用來指定已知和動態端點的技術。 下列主題將討論此資訊:
指定已知的端點
當您的伺服器使用已知的端點時,它可以包含端點資料作為其名稱服務資料庫專案的一部分。 如果這樣做,當用戶端從伺服器專案匯入系結控制碼時,用戶端的系結控制碼會包含包含已知端點的完整伺服器位址。
您的伺服器程式也可以同時指定已知的端點,同時指定通訊協定序列。 叫用 RpcServerUseProtseqEp 或 RpcServerUseProtseqEpEx 函式。 這兩者之間的差異在於,後者函式具有伺服器可用來控制動態埠配置的額外參數。
如果您的伺服器程式以這種方式指定其端點資訊,它也應該呼叫 RpcEpRegister 函式,以在端點對應中註冊端點。 即使端點一律相同,用戶端仍可使用端點對應來尋找伺服器。
如同通訊協定序列,應用程式可以在其 IDL 檔案中指定端點資訊。 當這樣做時,它應該同時註冊通訊協定序列和端點,方法是叫用 RpcServerUseAllProtseqsIf 或 RpcServerUseAllProtseqsIfEx 函式。 在此情況下,用戶端可以透過 IDL 檔案中的介面規格存取端點資訊。 因此,不需要呼叫 RpcEpRegister 函式。
指定動態端點
動態端點是伺服器主機電腦開始執行時所指派的端點。 大部分的伺服器應用程式都會使用動態端點,以避免與其他程式發生衝突,而非伺服器主機電腦上可用的有限埠數目。 不過,使用具名管道或 ncalrpc 通訊協定序列的程式具有非常大的端點名稱空間。 相較于使用其他傳輸的程式,它們受益于動態端點。
伺服器程式會在端點對應資料庫中註冊動態端點。 如果您想要伺服器使用任何可用的端點,請呼叫RpcServerUseAllProtSeqs、RpcServerUseAllProtseqsEx、RpcServerUseProtseq 或 RpcServerUseProtseqEx。 這會設定 RPC 執行時間程式庫,以搭配動態端點使用所有或一個有效的通訊協定序列 (s) 。 然後,伺服器應該呼叫 RpcServerInqBindings 以取得一組有效的系結控制碼。 伺服器會將系結控制碼集或系結向量傳遞至 RpcEpRegister 函式,以註冊端點對應中的所有適當端點。 針對您的伺服器對 RpcEpRegister進行的每個呼叫,應該會有對應的 RpcBindingVectorFree 呼叫,以釋放系結向量所使用的記憶體。
請注意,伺服器程式可以使用 RpcEpRegisterNoReplace 函式,而不是 RpcEpRegister。 當伺服器程式的多個複本必須在伺服器主機系統上執行時,程式通常會使用 RpcEpRegisterNoReplace 。
RpcEpRegister 和RpcEpRegisterNoReplace函式都會將伺服器的介面和系結控制碼新增至端點對應程式資料庫。 當用戶端使用部分系結控制碼進行遠端程序呼叫時,用戶端的執行時間程式庫會向伺服器電腦的端點對應程式詢問相容的伺服器實例端點。 用戶端程式庫提供介面 UUID、通訊協定序列,如果存在,用戶端系結控制碼中的物件 UUID。 端點對應程式會尋找符合用戶端資訊的資料庫專案。 用戶端/伺服器介面 UUID、介面主要版本和通訊協定順序必須完全相符。 此外,伺服器的介面次要版本必須大於或等於用戶端的次要版本。
如果所有測試都成功,端點對應程式會傳回有效的端點,而用戶端執行時間程式庫會更新系結控制碼中的端點。
當伺服器進程停止執行時,動態端點會自動從端點對應程式資料庫清除。 您可以在伺服器程式使用 RpcEpUnregister 函式結束之前,先從端點對應程式移除端點,也可以允許自動清除以管理移除端點。