KasperskyOS Community Edition 1.0

Реализация сущности Client в примере ping

Сущность Client для вызывает методы Ping и Pong в различной последовательности.

Инициализация транспорта до сервера, использование прокси-объекта и интерфейсных методов, а также назначение файла Connection.idl.h рассматриваются более подробно в комментариях к файлу client.c в примере echo.

client.c

#include <stdio.h>

#include <stdlib.h>

#include <stdint.h>

/* Файлы, необходимые для инициализации транспорта. */

#include <coresrv/nk/transport-kos.h>

#include <coresrv/sl/sl_api.h>

/* Описание интерфейса сервера, по которому обращается клиентская сущность. */

#include <ping/Connection.idl.h>

#define EXAMPLE_VALUE_TO_SEND 777

static const char *Tag = "[Client]";

static struct Connection_proxy proxy;

static uint32_t ping(uint32_t value)

{

/* Структуры запроса и ответа */

struct Connection_Ping_req req;

struct Connection_Ping_res res;

req.value = value;

/**

* Вызываем интерфейсный метод Connection_Ping.

* Серверу будет отправлен запрос для вызова метода Ping интерфейса

* control.connectionimpl с аргументом value. Вызывающий поток блокируется

* до момента получения ответа от сервера.

*/

if (Connection_Ping(&proxy.base, &req, NULL, &res, NULL) == rcOk)

{

fprintf(stderr, "%s Ping(%d), result = %d\n", Tag, value, res.result);

value = res.result;

}

else

{

fprintf(stderr, "%s Ping(%d), failed\n", Tag, value);

}

return value;

}

static uint32_t pong(uint32_t value)

{

/* Структуры запроса и ответа */

struct Connection_Pong_req req;

struct Connection_Pong_res res;

req.value = value;

/**

* Вызываем интерфейсный метод Connection_Pong.

* Серверу будет отправлен запрос для вызова метода Pong интерфейса

* controlimpl.connectionimpl с аргументом value. Вызывающий поток блокируется

* до момента получения ответа от сервера.

*/

if (Connection_Pong(&proxy.base, &req, NULL, &res, NULL) == rcOk)

{

fprintf(stderr, "%s Pong(%d), result = %d\n", Tag, value, res.result);

value = res.result;

}

else

{

fprintf(stderr, "%s Pong(%d), failed\n", Tag, value);

}

return value;

}

/* Точка входа в клиентскую сущность. */

int main(int argc, const char *argv[])

{

NkKosTransport transport;

uint32_t value;

int i;

fprintf(stderr, "%s Entity started\n", Tag);

/**

* Получаем клиентский IPC-дескриптор соединения с именем

* "server_connection".

*/

Handle handle = ServiceLocatorConnect("server_connection");

if (INVALID_HANDLE == handle)

{

fprintf(stderr, "%s ServiceLocatorConnect failed\n", Tag);

return EXIT_FAILURE;

}

/* Инициализируем IPC-транспорт для взаимодействия с серверной сущностью. */

NkKosTransport_Init(&transport, handle, NK_NULL, 0);

/* Получаем Runtime Interface ID (RIID) для интерфейса ping.Control.connectionimpl. */

nk_iid_t riid = ServiceLocatorGetRiid(handle, "ping.Control.connectionimpl");

if (INVALID_RIID == riid)

{

fprintf(stderr, "%s ServiceLocatorGetRiid failed\n", Tag);

return EXIT_FAILURE;

}

/**

* Инициализируем прокси-объект, указав транспорт (&transport)

* и идентификатор интерфейса сервера (riid). Каждый метод

* прокси-объекта будет реализован как отправка запроса серверу.

*/

Connection_proxy_init(&proxy, &transport.base, riid);

/* Тестовый цикл. */

value = EXAMPLE_VALUE_TO_SEND;

for (i = 0; i < 5; ++i)

{

value = ping(value);

value = pong(value);

}

value = ping(value);

value = ping(value);

value = pong(value);

value = pong(value);

return EXIT_SUCCESS;

}