Dela via


Klientutveckling med kontextreferenser

Den enda användning som ett klientprogram har för en kontextreferens är att skicka den till servern varje gång klienten gör ett fjärrproceduranrop. Klientprogrammet behöver inte komma åt innehållet i handtaget. Det bör inte försöka ändra kontexthandelsdata på något sätt. De fjärrprocedurer som klienten anropar utför alla nödvändiga åtgärder i serverns kontext.

Innan en kontextreferens begärs från en server måste klienter upprätta en bindning med servern. Klienten kan använda ett automatiskt, implicit eller explicit bindningshandtag. Med ett giltigt bindningshandtag kan klienten anropa en fjärrprocedur på servern som antingen returnerar en öppen kontextreferens (NULL) eller skickar en via en [out] parameter i parameterlistan för fjärrproceduren.

Klienter kan använda öppna kontextreferenser på alla sätt de behöver. De bör dock ogiltigförklara handtaget när de inte längre behöver det. Det finns två sätt att göra detta:

  • Anropa en fjärrprocedur som erbjuds av serverprogrammet och som frigör kontexten och stänger kontexthandtaget (sätter det till NULL).
  • När servern inte kan nås anropar du funktionen RpcSsDestroyClientContext.

Den andra metoden rensar bara klientsidans tillstånd och rensar inte serversidans tillstånd, så det bör endast användas när nätverkspartitionen misstänks, och klienten och servern gör en oberoende rensning. Servern utför oberoende rensning via körningsrutinen. Klienten gör det med hjälp av funktionen RpcSsDestroyClientContext.

Följande kodfragment visar ett exempel på hur en klient kan använda ett kontexthandtag. Om du vill visa definitionen av gränssnittet som används i det här exemplet kan du läsa Gränssnittsutveckling med hjälp av kontextreferenser. Serverimplementeringen finns i Serverutveckling med kontexthanterare.

I det här exemplet anropar klienten RemoteOpen för att hämta en kontextreferens som innehåller giltiga data. Klienten kan sedan använda kontexthandtaget i fjärrproceduranrop. Eftersom den inte längre behöver bindningshandtaget kan klienten frigöra det explicita handtag som användes för att skapa kontexthandtaget:

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

Klientprogrammet i det här exemplet använder proceduren RemoteRead för att läsa en datafil på servern tills den stöter på slutet på filen. Den stänger sedan filen genom att anropa RemoteClose. Kontexthandtaget visas som en parameter i funktionerna RemoteRead och RemoteClose som:

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