Транспорт 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);
В начало