main(int args, char **argv) {
resmgr_attr_t resmgr_attr; // Структура атрибутов менеджера ресурсов
dispatch_t *dpp; // Указатель на структуру диспетчеризации,
// содержит идентификатор канала.
dispatch_context_t *ctp; // Контекстная структура; содержит буфер
// сообщений, буфер векторов ввода/вывода
int id;
int result;
char BufferRec[100];
int rcvid;
setlocale(LC_CTYPE, 'C-TRADITIONAL');
/* Здесь должны выполняться необходимые действия по инициализации
конкретного сервера */
/* Считаем, что все необходимое теперь выполнено... */
/* Инициализация интерфейса диспетчеризации */
if ((dpp = dispatch_create()) == NULL) {
printf('%s: невозможно разместить обработчик'
' диспетчеризации.
', argv[0]);
return EXIT_FAILURE;
}
/* В результате по адресу dpp создана структура диспетчеризации */
/* Инициализация атрибутов менеджера ресурсов */
memset(&resmgr_attr, 0, sizeof resmgr_attr);
resmgr_attr.nparts_max = 1;
resmgr_attr.msg_max_size = MESSIZE_MAX;
/* Задаем число доступных структур векторов ввода/вывода (IOV) = 1.
Задаем максимальный размер буфера получения равным MESSIZE_MAX.
В результате инициализируются атрибуты менеджера ресурсов */
/* Инициализация функций обработки сообщений */
iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs,
_RESMGR_IO_NFUNCS, &io_funcs);
/* В результате заполняются две таблицы (структуры), задающие функции
обработки для двух специальных типов сообщений:
таблица функций связи и таблица функций ввода/вывода.
В соответствующих местах размещаются принимаемые по умолчанию функции
iofunc_*_default() ... Своими не заменяем - нет необходимости. */
/* Инициализация используемой устройством структуры атрибутов */
iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0);
attr.nbytes = MESSIZE_MAX + 1;
/* В результате инициализируется структура атрибутов,
используемая устройством;
S_IFNAM указывает, что тип устройства - Special named file,
побитовые флаги определяют права доступа,
число байт в ресурсе задается равным размеру буфера. */
/* Прикрепление имени устройства */
if ((id = resmgr_attach(dpp, &resmgr_attr, '/dev/MESSTEST/RM', _FTYPE_ANY,
0, &connect_funcs, &io_funcs, &attr)) == -1) {
printf('%s: невозможно прикрепить имя менеджера'
' ресурсов.
', argv[0]);
return EXIT_FAILURE;
}
/* Ключевое действие: мы регистрируем на нашем узле имя /dev/MESSTEST/RM
dpp и resmgr_attr - инициализированные выше структуры;
/dev/MESSTEST/RM - ассоциированное с устройством имя,
_FTYPE_ANY - определяет тип открытия устройства (в данном случае
допускается любой тип запроса открытия); равный нулю флаг
разборки пути имени файла определяет, что запрос -
только по имени /dev/MESSTEST/RM,
&connect_funcs - заданные выше подпрограммы связи;
&io_funcs - заданные выше подпрограммы ввода/вывода;
attr - инициализированная выше структура атрибутов устройства.
Подключаем диапазон сообщений, которые должны рассматриваться как
приватные, с передачей их обработчику для таких сообщений -
PrivatHandler() */
if (message_attach(dpp, NULL, 0x5000, 0x5fff, &PrivatHandler, NULL) == -1) {
printf('невозможно подключить данный '
'диапазон приватных сообщений
');
return(EXIT_FAILURE);
}
/* Размещение контекстной структуры */
ctp = dispatch_context_alloc(dpp);
/* Размер буфера сообщений, содержащегося а этой структуре, равно как и
число векторов ввода/вывода, также содержащихся в этой структуре,
установлены при инициализации структуры атрибутов менеджера ресурсов */
/* Запуск петли сообщений менеджера ресурсов */
while(1) {
// ожидание прихода сообщений
if ((ctp = dispatch_block(ctp)) == NULL) {
printf('ошибка блока
');
return EXIT_FAILURE;
}
printf('Менеджер ресурсов получил сообщение'
' длиной %i байт
', ctp->resmgr_context.info.msglen);
result = dispatch_handler(ctp);
// сообщение раскодируется, и на основании заданных таблиц функций связи
// и ввода/вывода вызывается соответствующая функция обработки сообщения