Condividi tramite


Applicazione server

L'esempio seguente è dall'applicazione "Hello World" nella directory RPC\Hello del Platform Software Development Kit (SDK). Il lato server dell'applicazione distribuita informa il sistema che i servizi sono disponibili. Attende quindi le richieste client. Il compilatore MIDL deve essere usato con l'esempio seguente.

A seconda delle dimensioni dell'applicazione e delle preferenze di codifica, è possibile scegliere di implementare le procedure remote in uno o più file separati. In questo programma di esercitazione il file di origine Hellos.c contiene la routine del server principale. Il file Hellop.c contiene la procedura remota.

Il vantaggio di organizzare le procedure remote in file separati consiste nel fatto che le procedure possono essere collegate a un programma autonomo per eseguire il debug del codice prima che venga convertito in un'applicazione distribuita. Dopo aver eseguito le procedure nel programma autonomo, è possibile compilare e collegare i file di origine contenenti le procedure remote con l'applicazione server. Come nel file di origine dell'applicazione client, il file di origine dell'applicazione server deve includere il file di intestazione Hello.h.

Il server chiama le funzioni di runtime RPC RpcServerUseProtseqEp e RpcServerRegisterIf per rendere disponibili le informazioni di associazione al client. Questo programma di esempio passa il nome dell'handle dell'interfaccia a RpcServerRegisterIf. Gli altri parametri sono impostati su NULL. Il server chiama quindi la funzione RpcServerListen per indicare che è in attesa di richieste client.

L'applicazione server deve includere anche le due funzioni di gestione della memoria chiamate dal server stub: midl_user_allocate e midl_user_free. Queste funzioni allocano e liberano memoria nel server quando una routine remota passa i parametri al server. In questo programma di esempio , midl_user_allocate e midl_user_free sono semplicemente wrapper per le funzioni della libreria C malloc e gratuito. Si noti che, nel compilatore MIDL- generato dichiarazioni di inoltro, "MIDL" è maiuscolo. Il file di intestazione Rpcndr.h definisce rispettivamente midl_user_free e midl_user_allocate essere MIDL_user_free e MIDL_user_allocate.

/* 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);
}