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


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

Приведенный ниже пример приведен из приложения 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);
}