Udostępnij przez


Programowanie klienta przy użyciu uchwytów kontekstu

Jedynym zastosowaniem programu klienckiego dla uchwytu kontekstu jest przekazywanie go serwerowi za każdym razem, gdy klient wykonuje zdalne wywołanie procedury. Aplikacja kliencka nie musi uzyskiwać dostępu do zawartości dojścia. Nie należy w żaden sposób zmieniać danych obsługi kontekstu. Procedury zdalne wywoływane przez klienta wykonują wszystkie niezbędne operacje w kontekście serwera.

Przed zażądaniem uchwytu kontekstu od serwera, klienci muszą nawiązać powiązanie z serwerem. Klient może używać dojścia automatycznego, niejawnego lub jawnego powiązania. Przy prawidłowym dojściu powiązania klient może wywołać procedurę zdalną na serwerze, która zwraca otwarte (inne niżnull) uchwyt kontekstu lub przekazuje jeden za pośrednictwem [out] parametru na liście parametrów procedury zdalnej.

Klienci mogą używać otwartych dojść kontekstowych w dowolny sposób. Powinny one jednak unieważnić uchwyt, gdy nie będą już go potrzebować. W tym celu należy wykonać dwie czynności:

  • Aby wywołać zdalną procedurę oferowaną przez program serwera, która zwalnia kontekst i zamyka uchwyt kontekstu (ustawia go na NULL).
  • Gdy serwer jest nieosiągalny, wywołaj funkcję RpcSsDestroyClientContext.

Drugie podejście usuwa tylko stan po stronie klienta i nie czyści stanu po stronie serwera, dlatego powinno być używane tylko wtedy, gdy podejrzewany jest podział sieci, a klient i serwer wykonają niezależne czyszczenie. Serwer wykonuje niezależne czyszczenie za pomocą procedury zakończenia, klient wykonuje to przy użyciu funkcji RpcSsDestroyClientContext.

Poniższy fragment kodu przedstawia przykład użycia uchwytu kontekstowego przez klienta. Aby wyświetlić definicję interfejsu używanego w tym przykładzie, zobacz Tworzenie interfejsu z użyciem uchwytów kontekstowych. Aby uzyskać informacje na temat implementacji serwera, zobacz Rozwój serwera z użyciem uchwytów kontekstowych.

W tym przykładzie klient wywołuje metodę RemoteOpen, aby uzyskać uchwyt kontekstu zawierający prawidłowe dane. Klient może następnie użyć dojścia kontekstu w zdalnych wywołaniach procedur. Ponieważ nie potrzebuje już dojścia wiążącego, klient może zwolnić jawne dojście, które było użyte do utworzenia dojścia kontekstu.

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

Aplikacja kliencka w tym przykładzie używa procedury o nazwie RemoteRead, aby odczytać plik danych na serwerze, dopóki nie napotka końca pliku. Następnie zamyka plik, wywołując funkcję RemoteClose. Uchwyt kontekstu pojawia się jako parametr w funkcjach RemoteRead i RemoteClose w następujący sposób:

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