Реализация сущности client

В коде сущности client используются транспортные типы и методы, которые будут сгенерированы во время сборки решения компилятором NK на основе idl-описания интерфейса IPing.

Однако чтобы получить необходимые для реализации сущности описания типов и сигнатуры методов, вы можете воспользоваться компилятором NK непосредственно после создания edl-описания сущности, cdl-описаний компонентов и idl-описаний используемых интерфейсов взаимодействия. В результате необходимые типы и сигнатуры методов будут объявлены в сгенерированных файлах *.h.

В реализации сущности client необходимо:

  1. Получить клиентский IPC-дескриптор соединения (канала), используя функцию локатора сервисов ServiceLocatorConnect().

    На вход нужно передать имя IPC-соединения server_connection, заданное ранее в файле init.yaml.

  2. Инициализовать транспорт NkKosTransport, передав полученный IPC-дескриптор в функцию NkKosTransport_Init().
  3. Получить идентификатор необходимого интерфейса (RIID), используя функцию локатора сервисов ServiceLocatorGetRiid().

    На вход нужно передать полное имя реализации интерфейса IPing. Оно состоит из имен экземпляра компонента (ping_comp) и интерфейса (ping_impl), заданных ранее в server.edl и ping.cdl.

  4. Инициализировать прокси-объект, передав транспорт и идентификатор интерфейса в функцию IPing_proxy_init().
  5. Подготовить структуры запроса и ответа.
  6. Вызвать интерфейсный метод 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;

}

В начало