Локатор сервисов — небольшая библиотека, которая позволяет:
Значения IPC-дескриптора и RIID необходимы для обращения к конкретному интерфейсу конкретной серверной сущности. Эти значения используются при инициализации транспорта.
Чтобы использовать локатор сервисов, нужно в коде сущности подключить файл sl_api.h
:
#include <coresrv/sl/sl_api.h>
Основные функции локатора сервисов
Функции, используемые на клиентской стороне:
ServiceLocatorConnect()
– принимает имя соединения и возвращает клиентский IPC-дескриптор, соответствующий этому соединению (каналу).ServiceLocatorGetRiid()
– принимает IPC-дескриптор и имя реализации интерфейса в формате <имя экземпляра компонента>.<имя реализации интерфейса>
. Возвращает соответствующий идентификатор RIID (порядковый номер реализации интерфейса).Имя соединения указывается в файле init.yaml
, имя экземпляра компонента – в cdl-файле, а имя реализации интерфейса – в idl-файле.
Функции, используемые на серверной стороне:
ServiceLocatorRegister()
– принимает имя соединения и возвращает серверный IPC-дескриптор, соответствующий этому соединению (каналу). Если канал входит в группу, то функция вернет слушающий дескриптор этой группы.Пример использования локатора сервисов
Рассмотрим следующее решение, содержащее две сущности — client
и server
.
Клиентская сущность не реализует ни одного интерфейса.
client.edl
entity client
Серверная сущность содержит экземпляр компонента ping
. Имя экземпляра: ping_comp
.
server.edl
entity server
ping_comp: ping
Пусть компонент ping
содержит именованную реализацию интерфейса IPing
, объявленного в файле ping.idl
. Имя реализации: ping_impl
.
ping.cdl
component ping
ping_impl: ping.IPing
(Для краткости файл 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);
…
В начало