Cliententwicklung mithilfe von Kontexthandles

Die einzige Verwendung eines Clientprogramms für einen Kontexthandpunkt besteht darin, ihn jedes Mal an den Server zu übergeben, wenn der Client einen Remoteprozeduraufruf erstellt. Die Clientanwendung muss nicht auf den Inhalt des Handle zugreifen. Es sollte nicht versuchen, die Kontextdaten auf irgendeine Weise zu ändern. Die Remoteprozeduren, die der Client aufruft, führen alle erforderlichen Vorgänge im Kontext des Servers aus.

Bevor Sie einen Kontexthandpunkt von einem Server anfordern, müssen Clients eine Bindung mit dem Server einrichten. Der Client kann einen automatischen, impliziten oder expliziten Bindungshandpunkt verwenden. Mit einem gültigen Bindungshandpunkt kann der Client eine Remoteprozedur auf dem Server aufrufen, die entweder einen geöffneten (nicht NULL)-Kontexthandpunkt zurückgibt oder einen [ out] -Parameter in der Parameterliste der Remoteprozedur übergibt.

Clients können geöffnete Kontexthandpunkte auf jede Weise verwenden, die sie benötigen. Sie sollten jedoch den Handle ungültig machen, wenn sie sie nicht mehr benötigen. Es gibt zwei Möglichkeiten, dies zu tun:

  • Wenn Sie eine Remoteprozedur aufrufen möchten, die vom Serverprogramm angeboten wird, das den Kontext freigibt und den Kontexthandpunkt schließt (legt es auf NULL fest).
  • Wenn der Server nicht mehr erreichbar ist, rufen Sie die RpcSsDestroyClientContext-Funktion auf.

Der zweite Ansatz räumt nur den clientseitigen Zustand auf, und bereinigung nicht den serverseitigen Zustand, sodass es nur verwendet werden sollte, wenn die Netzwerkpartition vermutet wird, und der Client und der Server führt eine unabhängige Bereinigung durch. Der Server führt unabhängige Bereinigung durch die Ausführungsroutine aus, der Client führt dies mithilfe der Funktion RpcSsDestroyClientContext aus.

Das folgende Codefragment zeigt ein Beispiel für die Verwendung eines Kontexthandpunkts eines Clients. Informationen zum Anzeigen der Definition der in diesem Beispiel verwendeten Schnittstelle finden Sie unter "Interface Development Using Context Handle". Informationen zur Serverimplementierung finden Sie unter "Serverentwicklung mithilfe von Kontexthandles".

In diesem Beispiel ruft der Client RemoteOpen auf, um einen Kontexthandpunkt abzurufen, der gültige Daten enthält. Der Client kann dann den Kontexthandpunkt in Remoteprozeduraufrufen verwenden. Da der Bindungshandpunkt nicht mehr benötigt wird, kann der Client den expliziten Handle freizugeben, der zum Erstellen des Kontexthandpunkts verwendet wird:

// 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);

Die Clientanwendung in diesem Beispiel verwendet eine Prozedur namens RemoteRead, um eine Datendatei auf dem Server zu lesen, bis es ein Ende der Datei auftritt. Anschließend wird die Datei geschlossen, indem RemoteClose aufgerufen wird. Der Kontexthandpunkt wird als Parameter in den Funktionen RemoteRead und RemoteClose angezeigt:

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);
}