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.
Sunucu programı geliştirme perspektifinden bakıldığında bağlam tutamacı, yazılmamış bir işaretçidir. Sunucu programları, bağlam tanıtıcılarını bellekteki verilere veya başka bir depolama biçimine (disklerdeki dosyalar gibi) işaret ederek başlatır.
Örneğin, bir istemcinin veritabanındaki bir kayıt için bir dizi güncelleştirme istemek için bağlam tutamacını kullandığını varsayalım. İstemci, sunucuda bir uzak yordam çalıştırır ve ona bir arama anahtarı iletir. Sunucu programı veritabanında arama anahtarını arar ve eşleşen kaydın tamsayı kayıt numarasını alır. Daha sonra sunucu, kayıt numarasını içeren bir bellek konumuna void türünde bir işaretçiyi işaret edebilir. Döndüğünde, uzak yordamın bağlam tutamacı olarak işaretçiyi, dönüş değeri veya parametre listesi aracılığıyla geri vermesi gerekir. İstemcinin, kaydı güncellemek için uzak yordamları her çağırışında işaretçiyi sunucuya iletmesi gerekir. Bu güncelleştirme işlemlerinin her biri sırasında sunucu void işaretçisini tamsayı işaretçisi olacak şekilde çevirir.
Sunucu programı bağlam tutamacını bağlam verilerine işaret ettikten sonra bu tutamaç açık olarak kabul edilir. NULL değeri içeren tanıtıcılar kapatılır. sunucu, istemci onu kapatan bir uzak yordamı çağırana kadar açık bir bağlam tutamacını tutar. Eğer tanıtıcı açıkken istemci oturumu sonlandırılırsa, RPC çalışma zamanı, tanıtıcıyı serbest bırakmak için sunucu run-down rutinini çağırır.
Aşağıdaki kod parçası, bir sunucunun bağlam tutamacını nasıl uygulayabileceğini gösterir. Bu örnekte sunucu, istemcinin uzak yordamları kullanarak yazdığı bir veri dosyası tutar. Bağlam bilgileri, sunucunun veri yazacağı dosyadaki geçerli konumu izleyen bir dosya tanıtıcısıdır. Dosya tanıtıcısı, uzak yordam çağrıları için parametre listesindeki bağlam tutamacı olarak paketlenmiştir. Yapı, dosya adını ve dosya tutamacını içerir. Bu örneğin arabirim tanımı, Bağlam Tanıtıcılarını Kullanarak Arabirim Geliştirmebölümünde gösterilmektedir.
/* cxhndlp.c (fragment of file containing remote procedures) */
typedef struct
{
FILE* hFile;
char achFile[256];
} FILE_CONTEXT_TYPE;
RemoteOpen işlevi sunucuda bir dosya açar:
short RemoteOpen(
PPCONTEXT_HANDLE_TYPE pphContext,
unsigned char *pszFileName)
{
FILE *hFile;
FILE_CONTEXT_TYPE *pFileContext;
if ((hFile = fopen(pszFileName, "r")) == NULL)
{
*pphContext = (PCONTEXT_HANDLE_TYPE) NULL;
return(-1);
}
else
{
pFileContext = (FILE_CONTEXT_TYPE *)
MIDL_user_allocate(sizeof(FILE_CONTEXT_TYPE));
pFileContext->hFile = hFile;
// check if pszFileName is longer than 256 and if yes, return
// an error
strcpy_s(pFileContext->achFile, srlen(pszFileName), pszFileName);
*pphContext = (PCONTEXT_HANDLE_TYPE) pFileContext;
return(0);
}
}
RemoteRead işlevi sunucudaki bir dosyayı okur.
short RemoteRead(
PCONTEXT_HANDLE_TYPE phContext,
unsigned char *pbBuf,
short *pcbBuf)
{
FILE_CONTEXT_TYPE *pFileContext;
printf("in RemoteRead\n");
pFileContext = (FILE_CONTEXT_TYPE *) phContext;
*pcbBuf = (short) fread(pbBuf, sizeof(char),
BUFSIZE,
pFileContext->hFile);
return(*pcbBuf);
}
RemoteClose işlevi sunucudaki bir dosyayı kapatır. Sunucu uygulamasının kapatma işlevinin bir parçası olarak bağlam tanıtıcısına NULL ataması gerekir. Bağlam tanıtıcısının silindiğini sunucu aracına ve RPC çalışma zamanı kütüphanesine bildiren bu mesajdır. Aksi takdirde, bağlantı açık tutulacak ve sonunda bir bağlam sonlandırma işlemi gerçekleşecektir.
void RemoteClose(PPCONTEXT_HANDLE_TYPE pphContext)
{
FILE_CONTEXT_TYPE *pFileContext;
if (*pphContext == NULL)
{
//Log error, client tried to close a NULL handle.
return;
}
pFileContext = (FILE_CONTEXT_TYPE *)*pphContext;
printf("File %s closed.\n", pFileContext->achFile);
fclose(pFileConext->hFile);
MIDL_user_free(pFileContext);
// This tells the run-time, when it is marshalling the out
// parameters, that the context handle has been closed normally.
*pphContext = NULL;
}
Not
İstemcinin [in, out] yönlü öznitelikleri olan bir çağrıya geçerli bir bağlam tutamacı geçirmesi beklense de, RPC bu yön öznitelikleri bileşimi için NULL bağlam tanıtıcılarını reddetmez. NULL bağlam tutamacı, NULL işaretçisi olarak sunucuya geçirilir. bir NULL işaretçisi alındığında erişim ihlalini önlemek için [in, out] bağlam tutamacını içeren çağrıların sunucu kodu yazılmalıdır.