Desarrollo de cliente mediante identificadores de contexto
El único uso que tiene un programa cliente para un identificador de contexto es pasarlo al servidor cada vez que el cliente realiza una llamada a procedimiento remoto. La aplicación cliente no necesita acceder al contenido del identificador. No debe intentar cambiar el contexto controlar los datos de ninguna manera. Los procedimientos remotos que invoca el cliente realizan todas las operaciones necesarias en el contexto del servidor.
Antes de solicitar un identificador de contexto desde un servidor, los clientes deben establecer un enlace con el servidor. El cliente puede usar un identificador de enlace automático, implícito o explícito. Con un identificador de enlace válido, el cliente puede llamar a un procedimiento remoto en el servidor que devuelve un identificador de contexto abierto (distinto de NULL) o pasa uno a través de un parámetro [out] en la lista de parámetros del procedimiento remoto.
Los clientes pueden usar identificadores de contexto abiertos de cualquier manera que necesiten. Sin embargo, deben invalidar el identificador cuando ya no lo necesiten. Hay dos maneras de hacerlo:
- Para invocar un procedimiento remoto ofrecido por el programa de servidor que libera el contexto y cierra el identificador de contexto (lo establece en NULL).
- Cuando el servidor no sea accesible, llame a la función RpcSsDestroyClientContext .
El segundo enfoque solo limpia el estado del lado cliente y no limpia el estado del lado servidor, por lo que solo se debe usar cuando se sospecha la partición de red, y el cliente y el servidor realizarán una limpieza independiente. El servidor realiza una limpieza independiente a través de la rutina de ejecución, el cliente lo hace mediante la función RpcSsDestroyClientContext .
El fragmento de código siguiente presenta un ejemplo de cómo un cliente podría usar un identificador de contexto. Para ver la definición de la interfaz que usa este ejemplo, vea Desarrollo de interfaz mediante identificadores de contexto. Para la implementación del servidor, consulte Desarrollo de servidores mediante identificadores de contexto.
En este ejemplo, el cliente llama a RemoteOpen para obtener un identificador de contexto que contenga datos válidos. A continuación, el cliente puede usar el identificador de contexto en las llamadas a procedimientos remotos. Dado que ya no necesita el identificador de enlace, el cliente puede liberar el identificador explícito que usó para crear el identificador de contexto:
// 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);
La aplicación cliente de este ejemplo usa un procedimiento denominado RemoteRead para leer un archivo de datos en el servidor hasta que encuentre un final del archivo. A continuación, cierra el archivo llamando a RemoteClose. El identificador de contexto aparece como un parámetro en las funciones RemoteRead y RemoteClose como:
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);
}