Локатор сервисов — небольшая библиотека, которая позволяет:
Значения 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);
…
В начало