Compartilhar via


O aplicativo de servidor

O exemplo a seguir é do aplicativo 'Olá, Mundo' no diretório RPC\Hello do SDK (Platform Software Development Kit). O lado do servidor do aplicativo distribuído informa ao sistema que seus serviços estão disponíveis. Em seguida, ele aguarda solicitações do cliente. O compilador MIDL deve ser usado com o exemplo abaixo.

Dependendo do tamanho do aplicativo e das preferências de codificação, você pode optar por implementar procedimentos remotos em um ou mais arquivos separados. Neste programa de tutorial, o arquivo de origem Hellos.c contém a rotina do servidor main. O arquivo Hellop.c contém o procedimento remoto.

O benefício de organizar os procedimentos remotos em arquivos separados é que os procedimentos podem ser vinculados a um programa autônomo para depurar o código antes que ele seja convertido em um aplicativo distribuído. Depois que os procedimentos funcionarem no programa autônomo, você poderá compilar e vincular os arquivos de origem que contêm os procedimentos remotos com o aplicativo de servidor. Assim como acontece com o arquivo de origem do aplicativo cliente, o arquivo de origem do aplicativo-servidor deve incluir o arquivo de cabeçalho Hello.h.

O servidor chama as funções de tempo de execução RPC RpcServerUseProtseqEp e RpcServerRegisterIf para disponibilizar informações de associação para o cliente. Este programa de exemplo passa o nome do identificador de interface para RpcServerRegisterIf. Os outros parâmetros são definidos como NULL. Em seguida, o servidor chama a função RpcServerListen para indicar que está aguardando solicitações do cliente.

O aplicativo de servidor também deve incluir as duas funções de gerenciamento de memória que o stub do servidor chama: midl_user_allocate e midl_user_free. Essas funções alocam e liberam memória no servidor quando um procedimento remoto passa parâmetros para o servidor. Neste programa de exemplo, midl_user_allocate e midl_user_free são simplesmente wrappers para as funções da biblioteca C malloc e gratuitos. (Observe que, nas declarações de encaminhamento geradas pelo compilador MIDL, "MIDL" é maiúscula. O arquivo de cabeçalho Rpcndr.h define midl_user_free e midl_user_allocate a serem MIDL_user_free e 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);
}