Локатор сервисов — небольшая библиотека, которая позволяет:
Значения IPC-дескриптора и RIID необходимы для обращения к конкретному интерфейсу конкретной серверной сущности. Эти значения используются при инициализации транспорта.
Чтобы использовать локатор сервисов, нужно в коде сущности подключить файл sl_api.h:
#include <coresrv/sl/sl_api.h>
Основные функции локатора сервисов
Функции, используемые на клиентской стороне:
ServiceLocatorConnect() – принимает имя соединения и возвращает клиентский IPC-дескриптор, соответствующий этому соединению (каналу).ServiceLocatorGetRiid() – принимает IPC-дескриптор и имя реализации интерфейса в формате <имя экземпляра компонента>.<имя реализации интерфейса>. Возвращает соответствующий идентификатор RIID (порядковый номер реализации интерфейса).Имя соединения указывается в файле init.yaml, имя экземпляра компонента – в EDL-файле, а имя реализации интерфейса – в CDL-файле.
Функции, используемые на серверной стороне:
ServiceLocatorRegister() – принимает имя соединения и возвращает серверный IPC-дескриптор, соответствующий этому соединению (каналу). Если канал входит в группу, то функция вернет слушающий дескриптор этой группы.Пример использования локатора сервисов
Рассмотрим следующее решение, содержащее две сущности — Client и Server.
Клиентская сущность не реализует ни одного интерфейса.
Client.edl
entity Client
Серверная сущность содержит экземпляр компонента Ping. Имя экземпляра: ping_comp.
Server.edl
entity Server
components {
ping_comp: Ping
}
Пусть компонент Ping содержит именованную реализацию интерфейса Ping, объявленного в файле Ping.idl. Имя реализации: ping_impl.
Ping.cdl
component Ping
interfaces {
ping_impl: Ping
}
(Для краткости файл Ping.idl не приведен.)
В init-описании укажем, что сущности Client и Server должны быть соединены каналом с именем server_connection:
init.yaml
entities:
- name: Client
connections:
- target: Server
id: server_connection
- name: Server
Использование локатора сервисов на стороне клиента:
client.c
…
/* Подключаем локатор сервисов */
#include <coresrv/sl/sl_api.h>
…
/* Получаем клиентский IPC-дескриптор канала "server_connection" */
Handle handle = ServiceLocatorConnect("server_connection");
…
/* Получаем идентификатор (RIID) реализации ping_impl, содержащейся в экземпляре ping_comp */
nk_iid_t riid = ServiceLocatorGetRiid(handle, "ping_comp.ping_impl");
…
Использование локатора сервисов на стороне сервера:
server.c
…
/* Подключаем локатор сервисов */
#include <coresrv/sl/sl_api.h>
…
nk_iid_t iid;
/* Получаем серверный IPC-дескриптор канала "server_connection" */
Handle handle = ServiceLocatorRegister("server_connection", NULL, 0, &iid);
…
В начало