Application serveur
L’exemple ci-dessous provient de l’application « Hello World » dans le répertoire RPC\Hello du Kit de développement logiciel (SDK) de plateforme. Le côté serveur de l’application distribuée informe le système que ses services sont disponibles. Il attend ensuite les demandes des clients. Le compilateur MIDL doit être utilisé avec l’exemple ci-dessous.
En fonction de la taille de votre application et de vos préférences de codage, vous pouvez choisir d’implémenter des procédures distantes dans un ou plusieurs fichiers distincts. Dans ce programme de didacticiel, le fichier source Hellos.c contient la routine du serveur main. Le fichier Hellop.c contient la procédure distante.
L’avantage de l’organisation des procédures distantes dans des fichiers distincts est que les procédures peuvent être liées à un programme autonome pour déboguer le code avant sa conversion en application distribuée. Une fois que les procédures fonctionnent dans le programme autonome, vous pouvez compiler et lier les fichiers sources contenant les procédures distantes à l’application serveur. Comme avec le fichier source de l’application cliente, le fichier source de l’application serveur doit inclure le fichier d’en-tête Hello.h.
Le serveur appelle les fonctions d’exécution RPC RpcServerUseProtseqEp et RpcServerRegisterIf pour mettre les informations de liaison à la disposition du client. Cet exemple de programme transmet le nom du handle d’interface à RpcServerRegisterIf. Les autres paramètres ont la valeur NULL. Le serveur appelle ensuite la fonction RpcServerListen pour indiquer qu’il attend les demandes du client.
L’application serveur doit également inclure les deux fonctions de gestion de la mémoire que le stub du serveur appelle : midl_user_allocate et midl_user_free. Ces fonctions allouent et libèrent de la mémoire sur le serveur lorsqu’une procédure distante transmet des paramètres au serveur. Dans cet exemple de programme, midl_user_allocate et midl_user_free sont simplement des wrappers pour les fonctions de bibliothèque C malloc et gratuites. (Notez que, dans les déclarations avancées générées par le compilateur MIDL, « MIDL » est en majuscules. Le fichier d’en-tête Rpcndr.h définit midl_user_free et midl_user_allocate à MIDL_user_free et MIDL_user_allocate, respectivement.)
/* 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);
}