Чтение онлайн

на главную - закладки

Жанры

QNX/UNIX: Анатомия параллелизма
Шрифт:

Теперь, после создания канала, сервер может становиться на прием сообщений от клиентов:

rcvid = MsgReceive(NameServer->chid, &MsgBuf, sizeof MsgBuf);

Однако может так случиться, что клиент пошлет не непосредственное сообщение для сервера, а выполнит, скажем, чтение, что, по сути, тоже является отосланным сообщением. Поэтому при получении сообщений необходимо производить их «фильтрацию»:

if (MsgBuf.hdr_type >= _IO_BASE && Buffer.hdr.type <= _IO_MAX) {

MsgError(rcvid, ENOSYS);

continue;

}

Получив

от клиента некое предопределенное сообщение, сервер сбрасывает флаг
flagWork
и выходит из петли ожидания сообщений, тем самым завершая свою работу.

С учетом этих деталей и организован нижеописанный сервер.

Код процесса-сервера, использующего службу глобальных имен

#include <stdio.h>

#include <errno.h>

#include <stdlib.h>

#include <sys/dispatch h>

/* На сервер могут приходить и импульсы. Как минимум. */

typedef struct _pulse msg_header_t;

/* Структура сообщения состоит из заголовка и буфера наших данных */

typedef struct _MsgBuf {

msg_header_t hdr;

char* Buffer;

} MsgBuf_t;

int main {

name_attach_t* NameServer;

MsgBuf_t MsgBuf;

int rcvid;

char BufReply[100];

int flagWork = 1;

/* Создаем глобальное имя /dev/name/global/MyService */

if (!(NameServer = name_attach(NULL, "MyService",

NAME_FLAG_ATTACH_GLOBAL)))

return EXIT_FAILURE;

/* Становимся на петлю получения сообщений */

while (flgWork) {

if ((rcvid = MsgReceive(NameServer->chid, &MsgBuf,

sizeof MsgBuf, NULL)) == -1) {

printf("Ошибка при получении сервером MyService "

"сообщения
от клиента\n");

fflush(stdout);

break;

}

if (!rcvid) {

// Получен импульс

switch(MsgBuf.hdr.code) {

case _PULSE_CODE_DISCONNECT:

/* Поскольку для канала установлен флаг _NTO_CHF_DISCONNECT, ядро

автоматически не освобождает связи, установленные клиентом ранее.

Сервер должен выполнить это со своей стороны сам, "сознательно"

удалив маршрут от себя обратно к клиенту */

ConnectDetach(MsgBuf.hdr.scoid);

break;

case _PULSE_CODE_UNBLOCK;

/* Клиент пытается разблокироваться, не дождавшись ответа по Reply. Надо

выполнить какие-то действия, чтобы корректно (для себя)

обработать эту ситуацию, и все-таки отпустить этого клиента - ему

ведь надо! При этом импульсе в MsgBuf.hdr.value приходит rcvid */

MsgReply(MsgBuf.hdr.value.sival_int, EAGAIN, NULL, 0);

break;

default:

break;

}

continue;

// вновь уходим на петлю приема сообщений

}

/* Полученное сообщение находится в диапазоне системных сообщений

ввода/вывода. Не обрабатываем. */

if (MsgBuf.hdr.type >= _IO_BASE && MsgBuf.hdr.type <= _IO_MAX) {

MsgError(rcvid, ENOSYS);

continue;

}

/* А вот это - сообщение для сервера. Обрабатываем. */

if (MsgBuf.hdr.type <= 0x50001 || MsgBuf.hdr.type >= 0x500ff) {

printf("Сервер получил сообщение неизвестно от"

" кого с меткой %#x\n", MsgBuf.hdr.type);

strcpy(BufReply, "а кто это???");

Поделиться:
Популярные книги

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Отчий дом. Семейная хроника

Чириков Евгений Николаевич
Проза:
классическая проза
5.00
рейтинг книги
Отчий дом. Семейная хроника

Скандальная свадьба

Данич Дина
1. Такие разные свадьбы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Скандальная свадьба

Путанабус. Трилогия

Старицкий Дмитрий
Фантастика:
боевая фантастика
6.93
рейтинг книги
Путанабус. Трилогия

Идеальный мир для Лекаря 25

Сапфир Олег
25. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 25

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVI

Проданная невеста

Wolf Lita
Любовные романы:
любовно-фантастические романы
5.80
рейтинг книги
Проданная невеста

Потомок бога

Решетов Евгений Валерьевич
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
Потомок бога

С Д. Том 16

Клеванский Кирилл Сергеевич
16. Сердце дракона
Фантастика:
боевая фантастика
6.94
рейтинг книги
С Д. Том 16

Переиграть войну! Пенталогия

Рыбаков Артем Олегович
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
Переиграть войну! Пенталогия

От Советского Информбюро - 1941-1945 (Сборник)

Неизвестен 3 Автор
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
От Советского Информбюро - 1941-1945 (Сборник)

Санек 3

Седой Василий
3. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 3

Прометей: повелитель стали

Рави Ивар
3. Прометей
Фантастика:
фэнтези
7.05
рейтинг книги
Прометей: повелитель стали

Отмороженный 14.0

Гарцевич Евгений Александрович
14. Отмороженный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Отмороженный 14.0