Серверное приложение
Приведенный ниже пример приведен из приложения Hello World в каталоге RPC\Hello пакета SDK для платформенного программного обеспечения. Серверная сторона распределенного приложения сообщает системе, что ее службы доступны. Затем он ожидает запросов клиента. Компилятор MIDL должен использоваться в приведенном ниже примере.
В зависимости от размера приложения и настроек кодирования можно реализовать удаленные процедуры в одном или нескольких отдельных файлах. В этой учебной программе исходный файл Hellos.c содержит основную процедуру сервера. Файл Hellop.c содержит удаленную процедуру.
Преимущество организации удаленных процедур в отдельных файлах заключается в том, что процедуры можно связать с автономной программой для отладки кода перед преобразованием в распределенное приложение. После работы процедур в автономной программе можно скомпилировать и связать исходные файлы, содержащие удаленные процедуры с серверным приложением. Как и в исходном файле клиентского приложения, исходный файл сервера приложения должен содержать файл заголовка Hello.h.
Сервер вызывает функции времени выполнения RPC RpcServerUseProtseqEp и RpcServerRegisterIf, чтобы сделать сведения о привязке доступными для клиента. В этом примере программа передаёт имя идентификатора интерфейса в RpcServerRegisterIf. Другие параметры имеют значение NULL. Затем сервер вызывает функцию RpcServerListen, чтобы указать, что она ожидает клиентских запросов.
Серверное приложение также должно включать две функции управления памятью, которые вызывает заглушка сервера: midl_user_allocate и midl_user_free. Эти функции выделяют и освобождают память на сервере, когда удаленная процедура передает параметры серверу. В этом примере программы midl_user_allocate и midl_user_free — это просто обёртки для функций C-библиотеки malloc и free. (Обратите внимание, что в объявлениях пересылки, созданных компилятором MIDL, "MIDL" используется в верхнем регистре. Заголовочный файл Rpcndr.h определяет midl_user_free и midl_user_allocate как MIDL_user_free и 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);
}