La aplicación de servidor
El ejemplo siguiente procede de la aplicación "Hola mundo" en el directorio RPC\Hello del Kit de desarrollo de software de plataforma (SDK). El lado servidor de la aplicación distribuida informa al sistema de que sus servicios están disponibles. A continuación, espera las solicitudes de cliente. El compilador MIDL debe usarse con el ejemplo siguiente.
Según el tamaño de la aplicación y las preferencias de codificación, puede optar por implementar procedimientos remotos en uno o varios archivos independientes. En este programa de tutorial, el archivo de origen Hellos.c contiene la rutina del servidor principal. El archivo Hellop.c contiene el procedimiento remoto.
La ventaja de organizar los procedimientos remotos en archivos independientes es que los procedimientos se pueden vincular con un programa independiente para depurar el código antes de que se convierta en una aplicación distribuida. Después de que los procedimientos funcionen en el programa independiente, puede compilar y vincular los archivos de origen que contienen los procedimientos remotos con la aplicación de servidor. Al igual que con el archivo de origen de la aplicación cliente, el archivo de origen de la aplicación de servidor debe incluir el archivo de encabezado Hello.h.
El servidor llama a las funciones en tiempo de ejecución rpc RpcServerUseProtseqEp y RpcServerRegisterIf para que la información de enlace esté disponible para el cliente. Este programa de ejemplo pasa el nombre del identificador de interfaz a RpcServerRegisterIf. Los demás parámetros se establecen en NULL. A continuación, el servidor llama a la función RpcServerListen para indicar que está esperando solicitudes de cliente.
La aplicación de servidor también debe incluir las dos funciones de administración de memoria a las que llama el código auxiliar del servidor: midl_user_allocate y midl_user_free. Estas funciones asignan y liberan memoria en el servidor cuando un procedimiento remoto pasa parámetros al servidor. En este programa de ejemplo, midl_user_allocate y midl_user_free son simplemente contenedores para las funciones de la biblioteca de C malloc y gratis. (Tenga en cuenta que, en las declaraciones de reenvío generadas por el compilador MIDL, "MIDL" está en mayúsculas. El archivo de encabezado Rpcndr.h define midl_user_free y midl_user_allocate que se van a MIDL_user_free y MIDL_user_allocate, respectivamente).
/* file: hellos.c */
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "hello.h"
#include <windows.h>
void main()
{
RPC_STATUS status;
unsigned char * pszProtocolSequence = "ncacn_np";
unsigned char * pszSecurity = NULL;
unsigned char * pszEndpoint = "\\pipe\\hello";
unsigned int cMinCalls = 1;
unsigned int fDontWait = FALSE;
status = RpcServerUseProtseqEp(pszProtocolSequence,
RPC_C_LISTEN_MAX_CALLS_DEFAULT,
pszEndpoint,
pszSecurity);
if (status) exit(status);
status = RpcServerRegisterIf(hello_ServerIfHandle,
NULL,
NULL);
if (status) exit(status);
status = RpcServerListen(cMinCalls,
RPC_C_LISTEN_MAX_CALLS_DEFAULT,
fDontWait);
if (status) exit(status);
}
/******************************************************/
/* MIDL allocate and free */
/******************************************************/
void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
{
return(malloc(len));
}
void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
{
free(ptr);
}