Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bir istemci programının bağlam tanıtıcısı için sahip olduğu tek kullanım, istemci her uzak yordam çağrısı yaptığında bunu sunucuya geçirmektir. İstemci uygulamasının tanıtıcının içeriğine erişmesi gerekmez. Bağlam tutamacı verilerini hiçbir şekilde değiştirmeye çalışmamalıdır. İstemcinin çağırdığını uzak yordamlar, sunucunun bağlamında tüm gerekli işlemleri gerçekleştirir.
Bir sunucudan bağlam tanıtıcısı istemeden önce istemcilerin sunucuyla bir bağlama oluşturması gerekir. İstemci otomatik, örtük veya açık bağlama tutamacını kullanabilir. Geçerli bir bağlama tutamacı ile istemci, sunucuda açık (NULL olmayan) bağlam tutamacını döndüren veya uzak yordamın parametre listesindeki bir [out] parametresinden geçiren bir uzak yordamı çağırabilir.
İstemciler açık bağlam tanıtıcılarını istedikleri şekilde kullanabilir. Ancak artık ihtiyaç duymadığında tutamacı geçersiz kılmaları gerekir. Bunu iki şekilde yapabilirsiniz:
- Sunucu programı tarafından sunulan, bağlamı serbest bırakan ve bağlam tutamacını kapatan (onu NULL olarak ayarlayan) bir uzak yordamı çağırmak için.
- Sunucuya ulaşılamıyorsa rpcSsDestroyClientContextişleviniçağırın.
İkinci yaklaşım yalnızca istemci tarafı durumunu temizler ve sunucu tarafı durumunu temizlemez, bu nedenle yalnızca ağ bölümünden şüphelenildiğinde kullanılmalıdır ve istemci ve sunucu bağımsız bir temizleme yapar. Sunucu, run-down yordamı aracılığıyla bağımsız temizleme gerçekleştirir, istemci bunu RpcSsDestroyClientContext işlevini kullanarak yapar.
Aşağıdaki kod parçası, bir istemcinin bağlam tutamacını nasıl kullanabileceğine ilişkin bir örnek sunar. Bu örnekte kullanılan arabirimin tanımını görüntülemek için bkz. Bağlam Tanıtıcılarını Kullanarak Arabirim Geliştirme. Sunucu uygulaması için bkz. Bağlam Tanıtıcılarını Kullanarak Sunucu Geliştirme.
Bu örnekte, istemci geçerli veriler içeren bir bağlam tutamacını almak için RemoteOpen'ı çağırır. İstemci daha sonra uzaktan yordam çağrılarında bağlam tutamacını kullanabilir. Artık bağlama tutamacını gerektirmediğinden, istemci bağlam tutamacını oluşturmak için kullandığı açık tutamacı serbest bırakabilir.
// 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);
Bu örnekteki istemci uygulaması, bir dosya sonuyla karşılaşana kadar sunucudaki bir veri dosyasını okumak için RemoteRead adlı bir yordam kullanır. Ardından RemoteClose çağrısı yaparak dosyayı kapatır. Bağlam tutamacı RemoteRead ve RemoteClose işlevlerinde aşağıdaki gibi bir parametre olarak görünür:
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);
}