Поделиться через


Серверное приложение

Приведенный ниже пример получен из приложения "Hello World" в каталоге RPC\Hello пакета средств разработки программного обеспечения платформы (SDK). Серверная часть распределенного приложения информирует систему о доступности его служб. Затем он ожидает клиентских запросов. Компилятор MIDL необходимо использовать в приведенном ниже примере.

В зависимости от размера приложения и настроек кодирования можно реализовать удаленные процедуры в одном или нескольких отдельных файлах. В этом руководстве исходный файл Hellos.c содержит подпрограмму сервера main. Файл 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);
}