Код процесса-сервера, использующего службу глобальных имен
Код процесса-сервера, использующего службу глобальных имен
#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 "
"сообщения от клиента ");
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 ", MsgBuf.hdr.type);
strcpy(BufReply, "а кто это???");
} else {
printf("Сервер получил сообщение. "%s" ",
MsgBuf.Buffer);
strcpy(BufReply, "а, это ты, клиент");
}
MsgReply(rcvid, EOK, BufReply, strlen(BufReply) + 1);
}
// Конец петли получения сообщений
/* Отсоединяемся от службы глобальных имен */
name_detach(NameServer, 0);
return EXIT_SUCCESS;
}
Приложения-клиенты, которым надо использовать глобальную службу имен, могут использовать функцию API name_open(). В случае, когда служба обеспечивается несколькими серверами (интересная и очень полезная возможность, заключающаяся в том, что несколько серверов вправе на различных узлах сети объявить одну и ту же службу), правила связи со службой имен таковы:
• Если поставщик службы имеется на том же узле, что и приложение, запросившее службу, менеджер пытается связать приложение прежде всего с локальным поставщиком. Если связь успешна, приложение общается со своим поставщиком локально, что обеспечивает лучшую производительность.
• Если локальный поставщик отсутствует или по каким-то причинам отказывает в поставке службы, менеджер пытается связать приложение с другими поставщиками. Если имеется несколько удаленных поставщиков, то порядок, в котором производятся попытки установить с ними связь (т.е. кто получит связь первым), не определен.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Код процесса-сервера (менеджера ресурсов)
Код процесса-сервера (менеджера ресурсов) Для запуска сервера на удаленном узле выполните с терминала команду:# on -f /net/Bed-Test /net/904-3/home/ZZZ/BIN/TestMGRгде Bed-Test — имя удаленного узла, 904-3 — имя локального узла, /home/ZZZ/BIN/TestMGR — путь к исполняемому файлу.Вначале сервер выполняет
Использование менеджера службы глобальных имен
Использование менеджера службы глобальных имен Начиная с QNX версии 6.3 сервис глобальных имен, обеспечиваемый GNS-менеджером службы (утилитой gns), действует в сети. Используя этот сервис, нет необходимости организовывать программу как полноценный менеджер ресурсов, при
Код процесса-клиента, использующего службу глобальных имен
Код процесса-клиента, использующего службу глобальных имен #include <stdio.h>#include <errno.h>#include <stdlib.h>#include <sys/dispatch.h>/* На сервер могут приходить и импульсы. Как минимум. */typedef struct _pulse msg_header_t;/* Структура сообщения состоит из заголовка и буфера наших данных */typedef struct _MsgBuf
1.3. Информационная безопасность в условиях функционирования в России глобальных сетей
1.3. Информационная безопасность в условиях функционирования в России глобальных сетей Цель мероприятий в области информационной безопасности – защитить интересы субъектов информационных отношений. Интересы эти многообразны, но все они концентрируются вокруг трех
5.12. Завершение процесса сервера
5.12. Завершение процесса сервера Теперь мы запустим соединение клиент-сервер и уничтожим дочерний процесс сервера. Это симулирует сбой процесса сервера, благодаря чему мы сможем выяснить, что происходит с клиентом в подобных ситуациях. (Следует точно различать сбой
Установка глобальных параметров
Установка глобальных параметров В листинге 5.1 приведен пример содержимого файла dhcpd.conf, предназначенного для организации динамического распределения IP-адресов. Несмотря на то что данный конфигурационный файл очень прост, его можно использовать на практике для
12.11 Разработка базы данных сервера имен
12.11 Разработка базы данных сервера имен В небольшой организации можно иметь единую базу данных. Однако это не подойдет для больших фирм, охватывающих целый географический район. Например, если компания с именем домена fishfood.com имеет центральный офис в штате Мэн, а
Использование сервера Yaffil внутри процесса
Использование сервера Yaffil внутри процесса С точки зрения прикладной программы различие между встраиваемым сервером и обычным удаленным клиентом заключается в имени библиотеки динамической загрузки (DLL), связываемой с программой. Как известно, обычные приложения
23-й час Использование SQL в локальных и глобальных сетях
23-й час Использование SQL в локальных и глобальных сетях В ходе этого урока мы с вами поговорим о том как использовать SQL в сю-виях реального предприятия ичи локачьной сети компании и как испочьзовать SQL в InternetОсновными на этом уроке будут следующие темы• SQL на уровне
7.3.2. Концепции, касающиеся основных средств производственного процесса организации Основные средства производственного процесса организации (ППО)
7.3.2. Концепции, касающиеся основных средств производственного процесса организации Основные средства производственного процесса организации (ППО) Организация устанавливает и сопровождает набор основных средств производственного процесса, как показано на рис. 4.1. К
8.5. Коэффициенты в качестве глобальных параметров
8.5. Коэффициенты в качестве глобальных параметров До сих пор вы называли глобальными параметрами только значения компонентов, то есть сопротивление резисторов, индуктивность катушек и емкость конденсаторов. Однако за понятием «глобальный» кроется гораздо больше. Один
2.4. Предотвращение конфликта имен с помощью пространств имен
2.4. Предотвращение конфликта имен с помощью пространств имен ПроблемаВ несвязанных между собой модулях обнаружены конфликтующие имена или требуется заранее избежать возможности таких конфликтов, создав логические группы кода.РешениеДля структурирования кода
Инсталляция приложения, использующего удаленное взаимодействие
Инсталляция приложения, использующего удаленное взаимодействие Хватит акронимов! К этому моменту вы почти готовы к построению своего первого .NET-приложения, использующего удаленное взаимодействие. Но перед тем, как это сделать, мы должны обсудить одну деталь: процедуру
Тестирование приложения, использующего удаленное взаимодействие
Тестирование приложения, использующего удаленное взаимодействие При тестировании приложения начните с запуска серверного приложения, которое откроет HTTP-канал и зарегистрирует объект RemoteMessageObject для удаленного доступа. Затем запустите экземпляр приложения клиента.