Compartir a través de


Rutina de ejecución del contexto del servidor

Si la comunicación se interrumpe mientras el servidor mantiene el contexto en nombre del cliente, es posible que se necesite una rutina de limpieza para limpiar el estado mantenido por el servidor en nombre de un cliente determinado. Esta rutina de limpieza se denomina rutina de ejecución de contexto. Cuando se interrumpe una conexión, el código auxiliar del servidor y la biblioteca en tiempo de ejecución llamarán a esta rutina en cada identificador de contexto abierto por el cliente.

La rutina de ejecución de contexto es necesaria y se declara y se denomina implícitamente cuando se aplica el atributo [context_handle] a una definición de tipo. El servidor no llamará a la rutina de ejecución de contexto si el atributo [context_handle] se aplicó directamente a un parámetro.

La sintaxis de rutina de ejecución de contexto es:

void __RPC_USER type-id_rundown (type-id);

Tenga en cuenta que el nombre de tipo determina el nombre de la rutina de ejecución del contexto.

El fragmento de código siguiente presenta una rutina de ejecución de contexto de ejemplo. que llama al procedimiento RemoteClose usado en el ejemplo de Desarrollo de interfaz mediante identificadores de contexto, Desarrollo de servidores mediante identificadores de contexto y Desarrollo de cliente mediante identificadores de contexto. Este procedimiento cierra el identificador de archivo, libera la memoria asociada al archivo y asigna NULL al identificador de contexto. La asignación de NULL es el resultado de llamar a la función RemoteClose y no es necesario en un escenario de ejecución. El tiempo de ejecución de RPC limpia su estado independientemente de si el identificador de contexto está establecido en NULL.

//file: cxhndp.c (fragment of file containing remote procedures)
//The rundown routine is associated with the context handle type.  
void __RPC_USER PCONTEXT_HANDLE_TYPE_rundown(
    PCONTEXT_HANDLE_TYPE phContext)
{
    printf("Client died with an open file, closing it..\n");
    RemoteClose(&phContext);
    assert(phContext == 0);
}