Bagikan melalui


Pengembangan Klien Menggunakan Handel Konteks

Satu-satunya penggunaan program klien untuk handel konteks adalah meneruskannya ke server setiap kali klien melakukan panggilan prosedur jarak jauh. Aplikasi klien tidak perlu mengakses konten handel. Seharusnya tidak mencoba mengubah konteks menangani data dengan cara apa pun. Prosedur jarak jauh yang dipanggil klien melakukan semua operasi yang diperlukan pada konteks server.

Sebelum meminta handel konteks dari server, klien harus membuat pengikatan dengan server. Klien dapat menggunakan handel pengikatan otomatis, implisit, atau eksplisit. Dengan handel pengikatan yang valid, klien dapat memanggil prosedur jarak jauh di server yang mengembalikan handel konteks yang dibuka (non-NULL) atau meneruskannya melalui parameter [out] dalam daftar parameter prosedur jarak jauh.

Klien dapat menggunakan handel konteks yang terbuka dengan cara apa pun yang mereka butuhkan. Namun, mereka harus membatalkan handel ketika mereka tidak lagi membutuhkannya. Ada dua cara untuk melakukan ini:

  • Untuk memanggil prosedur jarak jauh yang ditawarkan oleh program server yang membebaskan konteks dan menutup handel konteks (mengaturnya ke NULL).
  • Ketika server tidak dapat dijangkau, panggil fungsi RpcSsDestroyClientContext .

Pendekatan kedua hanya membersihkan status sisi klien, dan tidak membersihkan status sisi server, sehingga harus digunakan hanya ketika partisi jaringan dicurigai, dan klien dan server akan melakukan pembersihan independen. Server melakukan pembersihan independen melalui rutinitas run-down, klien melakukannya menggunakan fungsi RpcSsDestroyClientContext .

Fragmen kode berikut menyajikan contoh bagaimana klien mungkin menggunakan handel konteks. Untuk melihat definisi antarmuka yang digunakan contoh ini, lihat Pengembangan Antarmuka Menggunakan Handel Konteks. Untuk implementasi server, lihat Pengembangan Server Menggunakan Handel Konteks.

Dalam contoh ini, klien memanggil RemoteOpen untuk mendapatkan handel konteks yang berisi data yang valid. Klien kemudian dapat menggunakan handel konteks dalam panggilan prosedur jarak jauh. Karena tidak lagi membutuhkan handel pengikatan, klien dapat membebaskan handel eksplisit yang digunakan untuk membuat handel konteks:

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

Aplikasi klien dalam contoh ini menggunakan prosedur yang disebut RemoteRead untuk membaca file data di server hingga menemukan akhir file. Kemudian menutup file dengan memanggil RemoteClose. Handel konteks muncul sebagai parameter dalam fungsi RemoteRead dan RemoteClose sebagai:

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