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