В коде сущности client
используются транспортные типы и методы, которые будут сгенерированы во время сборки решения компилятором NK на основе idl-описания интерфейса IPing
.
Однако чтобы получить необходимые для реализации сущности описания типов и сигнатуры методов, вы можете воспользоваться компилятором NK непосредственно после создания edl-описания сущности, cdl-описаний компонентов и idl-описаний используемых интерфейсов взаимодействия. В результате необходимые типы и сигнатуры методов будут объявлены в сгенерированных файлах *.h
.
В реализации сущности client
необходимо:
ServiceLocatorConnect()
.На вход нужно передать имя IPC-соединения server_connection
, заданное ранее в файле init.yaml.
NkKosTransport
, передав полученный IPC-дескриптор в функцию NkKosTransport_Init()
.RIID
), используя функцию локатора сервисов ServiceLocatorGetRiid()
.На вход нужно передать полное имя реализации интерфейса IPing
. Оно состоит из имен экземпляра компонента (ping_comp
) и интерфейса (ping_impl
), заданных ранее в server.edl и ping.cdl.
IPing_proxy_init()
.IPing_Ping()
, передав прокси-объект, а также указатели на запрос и ответ.client.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <assert.h>
/* Заголовочный файл реализации транспортного уровня для KasperskyOS. */
#include <coresrv/nk/transport-kos.h>
/* Заголовочный файл локатора сервисов. */
#include <coresrv/sl/sl_api.h>
/* Файл ping.idl.h будет сгенерирован из ping.idl при сборке решения.
* Файл ping.idl.h содержит сгенерированные методы и типы,
* необходимые для обращения к интерфейсу IPing: IPing_proxy, IPing_proxy_init,
* IPing_Ping_req, IPing_Ping_res, IPing_Ping. */
#include "ping.idl.h"
int main(int argc, const char *argv[])
{
NkKosTransport transport;
struct IPing_proxy proxy;
int i;
fprintf(stderr, "Hello I'm client\n");
/* Получаем клиентский IPC-дескриптор соединения с именем
* "server_connection". */
Handle handle = ServiceLocatorConnect("server_connection");
assert(handle != INVALID_HANDLE);
/* Инициализируем транспорт до сервера. */
NkKosTransport_Init(&transport, handle, NK_NULL, 0);
/* Получаем идентификатор интерфейса ping_comp.ping_impl. Здесь
* ping_comp – имя экземпляра компонента ping,
* ping_impl - имя реализации интерфейса IPing. */
nk_iid_t riid = ServiceLocatorGetRiid(handle, "ping_comp.ping_impl");
assert(riid != INVALID_RIID);
/* Инициализируем прокси-объект, указав транспорт до серверной сущности
* (&transport) и идентификатор интерфейса сервера (riid). Каждый метод
* прокси-объекта будет реализован как отправка запроса серверу. */
IPing_proxy_init(&proxy, &transport.base, riid);
/* Структуры запроса и ответа */
struct IPing_Ping_req req;
struct IPing_Ping_res res;
/* Инициализируем запрос: присваиваем значение 777 аргументу value
* (value - входной аргумент метода Ping). */
req.value = 777;
for (i = 0; i < 10; ++i)
{
/* Вызываем интерфейсный метод IPing_Ping, передав прокси-объект,
* а также указатели на запрос и ответ. При этом серверу будет
* отправлен запрос для вызова метода Ping интерфейса
* ping_comp.ping_impl с аргументом value. Поскольку у метода Ping
* нет агрументов типа sequence, арена не используется – вместо нее
* передается NULL.
* Поток блокируется до момента получения ответа от сервера. */
if (IPing_Ping(&proxy.base, &req, NULL, &res, NULL) == rcOk)
{
/* Выводим значение result, содержащееся в ответе
* (result - выходной аргумент метода Ping). */
fprintf(stderr, "result = %d\n", (int) res.result);
/* Помещаем полученное значение result в аргумент value. */
req.value = res.result;
}
else
fprintf(stderr, "Call failed\n");
}
return EXIT_SUCCESS;
}
В начало