使用內容控制碼進行用戶端開發

每次用戶端進行遠端程序呼叫時,唯一使用用戶端程式對內容控制碼進行傳遞至伺服器。 用戶端應用程式不需要存取控制碼的內容。 它不應該嘗試以任何方式變更內容處理資料。 用戶端叫用的遠端程式會在伺服器的內容上執行所有必要的作業。

在向伺服器要求內容控制碼之前,用戶端必須建立與伺服器的系結。 用戶端可以使用自動、隱含或明確的系結控制碼。 透過有效的系結控制碼,用戶端可以在伺服器上呼叫遠端程式,以傳回開啟的 (非Null) 內容控制碼,或透過遠端程式參數清單中的 [out] 參數傳遞一個。

用戶端可以透過任何需要的方式使用開啟的內容控制碼。 不過,當不再需要控制碼時,應該使控制碼失效。 有兩種方式可以執行此動作:

  • 若要叫用伺服器程式所提供的遠端程式,以釋放內容並關閉內容控制碼, (將它設定為 Null) 。
  • 當伺服器無法連線時,請呼叫 RpcSsDestroyClientCoNtext 函式。

第二種方法只會清除用戶端狀態,而且不會清除伺服器端狀態,因此只有在懷疑網路分割時才會使用,而用戶端和伺服器會執行獨立的清除。 伺服器會透過執行常式執行獨立清除,用戶端會使用 RpcSsDestroyClientCoNtext 函式來執行。

下列程式碼片段提供用戶端如何使用內容控制碼的範例。 若要檢視這個範例所使用的介面定義,請參閱 使用內容控制碼進行介面開發。 如需伺服器實作,請參閱 使用內容控制碼進行伺服器開發

在此範例中,用戶端會呼叫 RemoteOpen 以取得包含有效資料的內容控制碼。 然後,用戶端就可以在遠端程序呼叫中使用內容控制碼。 因為不再需要系結控制碼,用戶端可以釋放用來建立內容控制碼的明確控制碼:

// cxhndlc.c  (fragment of client side application)
printf("Calling the remote procedure RemoteOpen\n");
if (RemoteOpen(&phContext, pszFileName) < 0) 
{
    printf("Unable to open %s\n", pszFileName);
    Shutdown();
    exit(2);
}
 
// Now the context handle also manages the binding.
// The variable hBindingHandle is a valid binding handle.
status = RpcBindingFree(&hBindingHandle);
printf("RpcBindingFree returned 0x%x\n", status);
if (status) 
    exit(status);

此範例中的用戶端應用程式會使用名為 RemoteRead 的程式來讀取伺服器上的資料檔案,直到遇到檔案結尾為止。 然後,它會呼叫 RemoteClose 來關閉檔案。 內容控制碼會顯示為 RemoteRead 和 RemoteClose 函式中的參數::

printf("Calling the remote procedure RemoteRead\n");
do 
{
    cbRead = 1024; // Using a 1K buffer
    RemoteRead(phContext, pbBuf, &cbRead);
    // cbRead contains the number of bytes actually read.
    for (int i = 0; i < cbRead; i++)
        putchar(*(pbBuf+i));
} while(cbRead);
 
printf("Calling the remote procedure RemoteClose\n");
if (RemoteClose(&phContext) < 0 ) 
{
    printf("Close failed on %s\n", pszFileName);
    exit(2);
}