Реализация сущности Client в примере ping
Сущность Client
для вызывает методы Ping
и Pong
в различной последовательности.
Инициализация транспорта до сервера, использование прокси-объекта и интерфейсных методов, а также назначение файла Connection.idl.h
рассматриваются более подробно в комментариях к файлу client.c в примере echo.
client.c
/* Файлы, необходимые для инициализации транспорта. */
/* Описание интерфейса сервера, по которому обращается клиентская сущность. */
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;
}