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, "а кто это???");
Поделиться:
Популярные книги
Мастер...
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Жених из гроба
1. Гробокопательница
Фантастика:
юмористическое фэнтези
сказочная фантастика
фэнтези
5.00
рейтинг книги
Ищу жену с прицепом
2. Спасатели
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Гримуар тёмного лорда I
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Заклятие предков
3. Ведун
Фантастика:
фэнтези
альтернативная история
8.49
рейтинг книги
Крепость над бездной
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Рота Его Величества
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
Экспансия: Сотрудничество. Том 5
5. Планетарный десант
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Отверженный III: Вызов
3. Отверженный
Фантастика:
фэнтези
альтернативная история
7.73
рейтинг книги
Князь Серединного мира
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Возвышение Меркурия. Книга 8
8. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Эволюционер из трущоб. Том 5
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Локки 7. Потомок бога
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 4
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00