Транспорт NkKosTransport

Транспорт NkKosTransport является удобной надстройкой над системными вызовами Call, Recv и Reply. Он позволяет работать отдельно с фиксированной частью и ареной сообщений.

Структура NkKosTransport и методы работы с ней объявлены в файле transport-kos.h.

Чтобы инициализировать транспорт, достаточно вызвать функцию NkKosTransport_Init(), указав IPC-дескриптор канала, по которому должны передаваться сообщения (handle):

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

NkKosTransport transport;

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

Канал имеет два IPC-дескриптора: клиентский и серверный. Поэтому на стороне клиента при инициализации транспорта нужно указать клиентский дескриптор, а на стороне сервера – серверный дескриптор используемого канала.

Для вызова транспорта используются функции nk_transport_call(), nk_transport_recv() и nk_transport_reply(), объявленные в transport.h (подключен в файле transport-kos.h).

Функция nk_transport_call() предназначена для отправки запроса и получения ответа:

/* Фиксированная часть (req) и арена запроса (req_arena) должны быть инициализированы

* фактическими входными аргументами вызываемого метода. Фиксированная часть (req)

* должна также содержать значения RIID и MID.

* Функция nk_transport_call() формирует запрос и выполняет системный вызов Call.

* Полученный от сервера ответ помещается в res (фиксированная часть ответа) и

* res_arena (арена ответа). */

nk_transport_call(&transport.base, (struct nk_message *)&req, &req_arena, (struct nk_message *)&res, &res_arena);

При использовании на стороне клиента сгенерированного интерфейсного метода (например, метод IPing_Ping из примера echo) в запросе автоматически проставляются соответствующие значения RIID и MID, после чего вызывается функция nk_transport_call().

Функция nk_transport_recv() предназначена для получения запроса:

/* Функция nk_transport_recv () выполняет системный вызов Recv.

* Полученный от клиента запрос помещается в req (фиксированная часть ответа) и

* req_arena (арена ответа). */

nk_transport_recv(&transport.base, (struct nk_message *)&req, &req_arena);

Функция nk_transport_reply() предназначена для отправки ответа:

/* Фиксированная часть (res) и арена запроса (res_arena) должны быть инициализированы

* фактическими выходными аргументами вызываемого метода сервера.

* Функция nk_transport_reply() формирует ответ и выполняет системный вызов Reply. */

nk_transport_reply(&transport.base, (struct nk_message *)&res, &res_arena);

В начало