Создание программного комплекса для повышения доступности и отказоустойчивости информационной системы, разрабатываемой на предприятии ЗАО "Компания РОС"

Разработка программного комплекса и описание алгоритма. Разработка пользовательского интерфейса. Анализ тестовых испытаний программного блока. Защита пользователей от воздействия на них опасных и вредных факторов. Режимы работы программного комплекса.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 14.03.2013
Размер файла 1,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Переназначение центра:

Для переназначения центра необходимо выполнить следующую команду:

> ./floatcenter -change <ИМЯ_УЗЛА>

1.7.5 Сообщения оператору

В процессе работы программного комплекса могут выдаваться диагностические сообщения о некорректной работе программного комплекса (ошибках), которые необходимо передать разработчику.

Основными же сообщения оператору являются:

1. Сообщение о недостаточных правах на чтение\запись в файл журнала;

2. Сообщение о недостаточных правах на чтение файла параметров;

3. Сообщения, подтверждающие выполнение команды (рисунок 1.7.5.1).

Рисунок 1.7.5.1. - Подтверждение выполнения команды.

При попытке выполнить недопустимую команду, ее исполнение игнорируется.

2. Экологическая часть и безопасность жизнедеятельности

2.1 Исследование возможных опасных и вредных факторов, возникающих при работе с ЭВМ, и их воздействие на пользователей

Любой производственный процесс, в том числе и работа с вычислительной техникой, сопряжен с появлением опасных и вредных факторов.

Опасным называется фактор, воздействие которого на человека вызывает травму, то есть внезапное повреждение организма в результате воздействия внешних факторов.

Вредным называется фактор, длительное воздействие которого на человека, приводит к профессиональным заболеваниям. [17]

Факторы различаются в зависимости от источника возникновения.

2.1.1 Исследование возможных опасных и вредных факторов, возникающих при работе с ЭВМ

Питание ЭВМ производится от сети 220В. Так как безопасным для человека напряжением является напряжение 40В, то при работе на ЭВМ опасным фактором является поражение электрическим током.

В дисплее ЭВМ высоковольтный блок строчной развертки и выходного строчного трансформатора вырабатывает высокое напряжение до 25кВ для второго анода электронно - лучевой трубки. А при напряжении от 5 до 300 кВ возникает рентгеновское излучение различной жесткости, которое является вредным фактором при работе с ПЭВМ (при 15 - 25 кВ возникает мягкое рентгеновское излучение).

Развертка ЭЛТ создается напряжением с частотой:

85 Гц (кадровая развертка);

42 кГц (строчная развертка).

Следовательно, пользователь попадает в зону электромагнитного излучения низкой частоты, которое является вредным фактором.

Во время работы компьютера дисплей создает ультрафиолетовое излучение, при повышении плотности которого > 10 Вт/м2, оно становиться для человека вредным фактором. Его воздействие особенно сказывается при длительной работе с компьютером.

Во время работы компьютера вследствие явления статического электричества происходит электризация пыли и мелких частиц, которые притягивается к экрану.

Вывод:

При эксплуатации перечисленных элементов вычислительной техники могут возникнуть следующие опасные и вредные факторы:

поражение электрическим током;

рентгеновское излучение;

электромагнитное излучение;

ультрафиолетовое излучение;

статическое электричество.

2.1.2 Анализ влияния опасных и вредных факторов на пользователя

Влияние электрического тока

Электрический ток, воздействуя на человека, приводит к травмам. Такими травмами являются:

· Общие травмы:

судорожное сокращение мышц, без потери сознания;

судорожное сокращение мышц, с потерей сознания;

потеря сознания с нарушением работы органов дыхания и кровообращения;

состояние клинической смерти;

Местные травмы:

электрические ожоги;

электрический знак;

электро-автольмия.

Проходя через тело человека, электрический ток оказывает следующие воздействия:

термическое (нагрев тканей и биологической среды);

электролитическое (разложение крови и плазмы);

биологическое (способность тока возбуждать и раздражать живые ткани организма);

механическое (возникает опасность механического травмирования в результате судорожного сокращения мышц).

Наиболее опасным переменным током является ток 20 - 100 Гц. Так как компьютер питается от сети переменного тока частотой 50 Гц, то этот ток является опасным для человека. [18, 19]

Влияние рентгеновского излучения

В организме происходит:

торможение функций кроветворных органов;

нарушение нормальной свертываемости крови и т.д.

Влияние электромагнитных излучений низкой частоты

Электромагнитные поля с частотой 60 Гц и выше могут инициировать изменения в клетках животных (вплоть до нарушения синтеза ДНК). В отличие от рентгеновского излучения, электромагнитные волны обладают необычным свойством: опасность их воздействия при снижении интенсивности не уменьшается, мало того, некоторые поля действуют на клетки тела только при малых интенсивностях или на конкретных частотах. Оказывается переменное электромагнитное поле, совершающее колебания с частотой порядка 60 Гц, вовлекает в аналогичные колебания молекулы любого типа, независимо от того, находятся они в мозге человека или в его теле. Результатом этого является изменение активности ферментов и клеточного иммунитета, причем сходные процессы наблюдаются в организмах при возникновении опухолей.

Влияние ультрафиолетового излучения

Ультрафиолетовое излучение - электромагнитное излучение в области, которая примыкает к коротким волнам и лежит в диапазоне длин волн ~ 200 - 400 нм.

Различают следующие спектральные области:

200 - 280 нм - бактерицидная область спектра.

280 - 315 нм - Зрительная область спектра (самая вредная).

315 - 400 нм - Оздоровительная область спектра.

Синий люминофор экрана монитора вместе с ускоренными в электронно-лучевой трубке электронами являются источниками ультрафиолетового излучения. Воздействие ультрафиолетового излучения сказывается при длительной работе за компьютером. Основными источниками поражения являются глаза и кожа.

Энергетической характеристикой является плотность потока мощности [Вт/м2].

Биологический эффект воздействия определяется внесистемной единицей [эр]. 1 эр - это поток (280 - 315 нм), который соответствует потоку мощностью 1 Вт.

Воздействие ультрафиолетового излучения сказывается при длительной работе за компьютером. Максимальная доза облучения:

7,5 мэр·ч/м2 за рабочую смену;

60 мэр·ч/ м2 в сутки.

При длительном воздействии и больших дозах могут быть следующие последствия:

серьезные повреждения глаз (катаракта);

рак кожи;

кожно-биологический эффект (гибель клеток, мутация, канцерогенные накопления);

фототоксичные реакции.

Влияние статического электричества

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

Особенно стабильно электростатический эффект наблюдается у компьютеров, которые находятся в помещении с полами, покрытыми синтетическими коврами.

При повышении напряженности поля Е > 15 кВ/м, статическое электричество может вывести из строя компьютер. [22]

Вывод:

Из анализа воздействий опасных и вредных факторов на организм человека следует необходимость защиты от них.

2.2 Способы защиты пользователей от воздействия на них опасных и вредных факторов

2.2.1 Методы и средства защиты от поражения электрическим током

В помещении вычислительного центра существует опасность прикосновения одновременно к предметам, имеющим соединения с землей, и металлическому корпусу электрооборудования.

Как основной способ борьбы с опасностью поражения электрическим током (от поражения напряжением прикосновения) используется зануление.

Зануление - это преднамеренное соединение нетоковедущих металлических частей, которые могут оказаться под напряжением в результате повреждения изоляции, с нулевым защитным проводником (применяется в трехфазных сетях с заземленной нейтралью в установках до 1000 вольт, см. рис. 2.1). [19]

Рисунок 2.1 - Защитное зануление

Для защиты используется нулевой защитный провод. В сеть вставляется предохранитель (автомат). Принцип защиты пользователей при занулении заключается в отключении сети за счет тока короткого замыкания, который вызывает перегорание предохранителя и отключает сеть.

При нормальном режиме работы сети ток, текущий через человека, можно рассчитать по формуле 2.1.

Iч = Uф/(Rч+r0) (2.1)

где Iч - ток, протекающий через человека [А];

Uф - фазовое напряжение (Uф = 220 В), [В];

Rч - сопротивление тела человека (Rч = 1000 Ом), [Ом];

r0 - сопротивление заземлителя (сопротивление обуви ~ 10 Ом), [Ом];

Так как r0 << Rч - следовательно, сопротивление заземлителя можно в расчет не брать. Получается, что практически все Uф применено к телу человека и, следовательно, получается по формуле 2.2:

Iч = Uф/Rч (2.2)

Iч = 220/1000 = 0,22 А

Допустимые значения приложенного напряжения и протекающего через человека тока соответственно равны 36 В и 0,006 А. Полученные же при расчете цифры горазда превосходят эти значения (220 В и 0,22 А).

Рассчитаем ток короткого замыкания (Iкз) по формуле 2.3 при срабатывании защитной схемы зануления и параметры предохранителя (Iном), используемого в схеме.

(2.3)

где Uф - фазное напряжение сети питания (Uф = 220 В), [В];

rТ - паспортная величина сопротивления обмотки трансформатора, (rТ = 0,312 Ом), [Ом].

Rобщ = r1 + r2 + r3 (2.4)

где (2.5)

? - удельное сопротивление нулевого защитного проводника (для меди ? = 0,0175 Ом·м), [Ом·м];

l - длина проводника, [м];

S - площадь поперечного сечения нулевого защитного проводника (S = 1 мм2), [мм2].

Возьмем l1 = 850 м, l2 = 150 м, l3 = 70 м;

r1 = 0,0175·850/1 = 14,875 Ом

r2 = 0,0175·150/1 =2,625 Ом

r3 = 0,0175·70/1 = 1,225 Ом

Rобщ = 14,875 Ом + 2,625 Ом + 1,225 Ом = 18,725 Ом

По величине Iкз определим, с каким Iном необходимо в цепь питания ЭВМ включать автомат.

, следовательно (2.6)

Где k - коэффициент, указывающий тип защитного устройства (в зависимости от типа автомата: k=3 для автомата с электромагнитным расщепителем).

Iном = 11,68 А / 3 = 3,9 А

Вывод:

Для отключения ПЭВМ от сети в случае короткого замыкания или других неисправностей в цепь питания ПЭВМ необходимо ставить автомат с Iном = 4 А. алгоритм программный пользователь интерфейс

2.2.2 Методы и средства защиты от рентгеновского излучения

Существует 3 основных способа защиты от рентгеновского излучения:

время (работа не более 4 часов);

расстояние (не менее 50 см от экрана);

экранирование.

Необходимо придерживаться строгого графика работы - время работы за компьютером не должно превышать половины рабочей смены (4 часа).

Для рентгеновского излучения - предельно допустимая доза для людей, которые постоянно или временно работают непосредственно с источником ионизирующих излучений не должна превышать D = 0,5 бэр/год в год.

Определим уровень мощности дозы на различных расстояниях от экрана монитора по формуле 2.7:

Рri = Р0·е-?·r (2.7)

гдеР0 - мощность дозы излучения на расстоянии 5 см от экрана, мкР/ч;

Prj - уровень мощности рентгеновского излучения на заданном расстоянии, мкР/ч;

r - расстояние от экрана, см;

? - коэффициент ослабления воздухом рентгеновских лучей, см-1.

Для расчета возьмем ? = 3,14·10-2 см-1.

Таблица 2.1 - Зависимость уровня мощности дозы от расстояния до источника

r, см

5

10

30

40

50

60

Рrj, мкР/ч

100

73

53

39

28

21

Принимая среднее расстояние между пользователем и монитором за 60 см и зная, что годовая доза рентгеновского излучения опасная для здоровья равна 0,5Р - можно рассчитать по формуле 2.8 реальную дозу радиации получаемую пользователем за год:

Dr = Di · n · n1 · n2 (2.8)

где Dr - доза радиации за год;

n - нормируемое ежедневное время работы за монитором равное 4ч;

n1 - количество рабочие дней в неделю (5 дней);

n2 - количество рабочих недель в году (в среднем 43 недели);

Di - мощность дозы рентгеновского излучения на расстоянии 60 cм;

Dr = 15,2 · 4 · 5 · 43 = 0,013Р (бэр).

0,013Р < 0,5Р (предельно допустимая доза 0,5Р значительно превосходит полученное значение дозы).

Вывод:

Оператору рекомендуется находиться от монитора на расстоянии не менее 60 см.

2.2.3 Методы и средства защиты от ультрафиолетового излучения

Для защиты от ультрафиолетового излучения:

защитный фильтр или специальные очки (толщина стекол 2мм, насыщенных свинцом);

одежда из фланели и поплина;

побелка стен и потолка (ослабляет на 45-50%).

мощность люминисцентных ламп не должна превышать 40 Вт

2.2.4 Методы и средства защиты от электромагнитных полей низкой частоты

Защита от электромагнитных излучений осуществляется временем, расстоянием, экранированием:

время работы - не более 4 часов;

расстояние - не менее 50 см от источника;

экранирование.

Относительно электромагнитных излучений низкой частоты можно отметить, что в современных мониторах нижний предел спектра смещен в сторону высоких частот посредством увеличения частоты кадровой развертки до 90 - 120Гц и значительно превышает наиболее опасную частоту - 60 Гц.

Чтобы уменьшить опасность надо:

не работать с открытой ЭВМ;

соблюдать расстояния между соседними ЭВМ (не < 1,5м)

исключить пребывание сбоку от монитора (? 1,2 м).

2.2.5 Методы и средства защиты от статического электричества

Электростатические поля вызывают скопление пыли, попадающей на лицо и глаза оператора.

Норма: 15 кВ/м.

Защита от статического электричества и вызванных им явлений осуществляется следующими способами:

наличие контурного заземления;

использование нейтрализаторов статического электричества;

скорость подвижного воздуха в помещении должна быть не более 0,2 м/с;

отсутствие синтетических покрытий;

ежедневная влажная уборка помещения вычислительного центра для уменьшения количества пыли;

проветривание без присутствия пользователя. [21,22]

Вывод:

Выбранные методы и способы защиты от опасных и вредных факторов обеспечивают защиту пользователей, работающих с вычислительной техникой.

2.3 Эргономические требования к рабочим местам пользователей

Выполнение эргономических рекомендаций по эксплуатации компьютеров позволяет значительно снизить вредные воздействия находящихся в эксплуатации ПЭВМ. В первую очередь безопасность при работе с ПЭВМ может быть обеспечена за счет рационального размещения компьютеров в помещениях, оптимальной с точки зрения эргономики организации рабочего дня пользователей, а также за счет применения средств повышения контраста изображения и защиты от бликов на экране, электромагнитных излучений и электростатического поля.

Рекомендации охватывают следующий круг вопросов:

· Требования к помещениям и оборудованию рабочих мест.

· Рекомендации по защите пользователей от излучений ПЭВМ.

2.3.1 Требования к помещениям, оборудованию рабочих мест и освещенности

Помещения должны иметь естественное и искусственное освещение. Желательна ориентация оконных проемов на север или северо-восток. Оконные проемы должны иметь регулируемые жалюзи или занавеси, позволяющие полностью закрывать оконные проемы. Занавеси следует выбирать одноцветные, гармонирующие с цветом стен, выполненные из плотной ткани и шириной в два раза больше ширины оконного проема. Для дополнительного звукопоглощения занавеси следует подвешивать в складку на расстоянии 15 ? 20 см от стены с оконными проемами. [18, 23]

Рабочие места по отношению к световым проемам должны располагаться так, чтобы естественный свет падал сбоку, преимущественно - слева.

Для устранения бликов на экране, также как чрезмерного перепада освещенности в поле зрения, необходимо удалять экраны от яркого дневного света.

Рабочие места должны располагаться от стен с оконными проемами на расстоянии не менее 1 м.

Освещенность на рабочем месте с ПЭВМ должна быть не менее 300 лк.

Поверхность пола в помещениях должна бать ровной, без выбоин, нескользкой, удобной для чистки и влажной уборки, обладать антистатическими свойствами. [20]

Рекомендуемый микроклимат в помещениях при работе с ПЭВМ:

температура 19 ? 21?С;

относительная влажность воздуха 55 ? 62%.

Площадь на одно рабочее место должна составлять примерно 6 м2 (объем - не меньше 20м3). Конструкция рабочего места пользователя ПЭВМ (при работе сидя) должна обеспечивать поддерживание оптимальной рабочей позы с такими эргономичными характеристиками:

ступня ног - на полу или на подставке для ног;

бедра - в горизонтальной плоскости;

предплечье - вертикально;

локти - под углом 70 - 90? к вертикальной плоскости;

запястья согнуты под углом не больше 20? относительно горизонтальной плоскости;

наклон головы - 15 - 20? относительно вертикальной плоскости;

монитор должен располагаться напротив глаз пользователя и на оптимальном расстоянии от них, но не ближе 60 см. [20,23,24]

2.3.2 Рекомендации по защите пользователей от излучений ПЭВМ

Если в помещении эксплуатируется более одного компьютера, то следует учесть, что на пользователя одного компьютера могут воздействовать излучения от других ПЭВМ, в первую очередь со стороны боковых и задних стенок дисплея. Учитывая, что от излучения со стороны экрана дисплея можно защититься применением специальных фильтров, необходимо, чтобы пользователь размещался от боковых и задних стенок других дисплеев на расстоянии не менее 1,5 м. [18]

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

2.4 Выводы

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

Заключение

В результате проделанной работы был разработан программный комплекс для решения задачи повышения отказоустойчивости проектируемой информационной системы в оборонном, коммерческом и личном использовании.

Учитывая требования:

* программный комплекс должен реализовывать заданный механизм поддержания работоспособности информационной системы;

* программный комплекс должен обеспечивать автоматическую и ручную режимы работы;

* программный комплекс должен функционировать под управлением ОС на базе BSD 4.4;

* программный комплекс должен быть реализован на языке C++;

* программный комплекс должен обеспечивать функцию журналирования своей работы;

* работа программного комплекса должна быть прозрачна для пользователя.

Программный комплекс был внедрен в научно-исследовательскую деятельность ЗАО «Компания РОС» на этапе создания комплексного имитационно-моделирующего стенда.

Список использованной литературы

1. Статья “Кластер (группа компьютеров)” / Википедия: Свободная энциклопедия.-http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80_(%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BE%D0%B2)

2. Статья “Кластер (группа серверов)” / Википедия: Свободная энциклопедия.- http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80_(%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%B2)

3. Распределенные системы. Принципы и парадигмы / Э. Таненбаум, М. Ван Стеен. Спб.: Питер, 2009. - 877 с.

4. Технические страницы портала компании Microsoft. http://technet.microsoft.com/en-us/default.aspx

5. Официальная страница проекта Linux-HA. - http://www.linux-ha.org/

6. Джесс Либерти, Брэдли Джонс Освой самостоятельно C++ за 21 день.- М.: Вильямс, 2007.- 784 с.

7. Э. Таненбаум Компьютерные сети.- СПб.: Питер, 2007.- 992 с.

8. Официальный сайт компании Лидер computers. Статья Компьютерные сети.- М., http://www.leader-comp.ru/computer-network.html

9. Официальная страница проета FreeBSD - http://www.freebsg.org

10. Официальная страница проекта OpenNet - http://www.opennet.ru

11. Microsoft SQL Server 2000/ М.Ф.Гарсиа, Дж.Рединг, Э.Уолен, С.А.ДаЛюк - Спб: ЭКОМ, 2004 - 976 стр.

12. FreeBSD. Подробное руководство. Издание 2 / Майкл Лукас - Спб: Символ-Плюс, 2009г. - 864 стр.

13. ГОСТ 19.301-79 Программа и методика испытаний. Требования к содержанию и оформлению. - Введ. 01.01.81 - Группа Т55.

14. ГОСТ 19.505-79 Руководство оператора. Требования к содержанию и оформлению. - Введ. 01.01.80 - Группа Т55.

15. ГОСТ 19.201-78 Техническое задание. Требования к содержанию и оформлению. - Введ. 01.01.80 - Группа Т55.

16. ГОСТ 19.701-90 Схемы алгоритмов, программ данных и систем. - Введ. 01.01.92 - Группа Т5.

17. ГОСТ 12.0.003-86. Опасные и вредные производственные факторы.

18. Сибаров Ю. Г. и др. Охрана труда на ВЦ. М., 1989.

19. ГОСТ 12.1.030-81. Электробезопасность. Защитное заземление, зануление.

20. САНПиН-1340-03. Гигиенические требования к персональным ЭВМ и организации работы.

21. ГОСТ ССБТ 12.1.045-84. Электростатические поля. Допустимые условия на рабочем месте.

22. ГОСТ ССБТ 12.1.124-84. Средства защиты от статического электричества.

23. ФЗ РФ №181. 1999 г. «Об основах охраны труда в РФ».

24. Трудовой кодекс РФ

Приложение 1

Текст программы

Головной модуль

#include "../conf/config.h"

#include <stdlib.h>

#include <stdio.h>

#include <unistd.h>

#include <sys/wait.h>

#include <../classes/cmessenger.h>

class CBrain: public IMessenger {

public:

CBrain();

void FuncOnMsgRcv(Message msg);

void OnStoppingAll();

void Init();

~CBrain();

private:

int voice_pid, ear_pid, nose_pid, finger_pid, head_pid;

CMessenger *messenger;

int ppid;

bool stopping_all;

int p_started;

};

#include "cbrain.h"

CBrain::CBrain()

{

nose_pid = 2;

ear_pid = 2;

voice_pid = 2;

head_pid = 2;

ppid = getpid();

stopping_all = false;

p_started = 0;

printf("---=== Welcome to BRAIN ===---\n");

printf("Starting services...\n");

printf("BRAIN PID=%d\n",ppid);

printf("Starting voice...\n");

voice_pid = fork();

if (voice_pid < 0) {

perror("Brain: error calling fork()");

return;

} else if (voice_pid == 0) {

if (execl(VOICE_EXE, NULL) < 0) {

perror("Brain: error calling execl()");

}

}

printf("VOICE PID=%d\n",voice_pid);

printf("Starting ear...\n");

ear_pid = fork();

if (ear_pid < 0) {

perror("Brain: error calling fork()");

return;

} else if (ear_pid == 0) {

if (execl(EAR_EXE, NULL) < 0) {

perror("Brain: error calling execl()");

}

}

printf("EAR PID=%d\n",ear_pid);

printf("Starting nose...\n");

nose_pid = fork();

if (nose_pid < 0) {

perror("Brain: error calling fork()");

return;

} else if (nose_pid == 0) {

if (execl(NOSE_EXE, NULL) < 0) {

perror("Brain: error calling execl()");

}

}

printf("NOSE PID=%d\n",nose_pid);

printf("Starting finger...\n");

finger_pid = fork();

if (finger_pid < 0) {

perror("Brain: error calling fork()");

return;

} else if (finger_pid == 0) {

if (execl(FINGER_EXE, NULL) < 0) {

perror("Brain: error calling execl()");

}

}

printf("FINGER PID=%d\n",finger_pid);

printf("---=== Log of IPC ===---\n");

messenger = new CMessenger();

}

void CBrain::OnStoppingAll()

{

if (p_started == 0) {

messenger->stoplisten();

}

}

void CBrain::Init()

{

messenger->setExObjOnMsgRcv(this);

messenger->startlisten();

}

void CBrain::FuncOnMsgRcv(Message msg)

{

int pid;

int status;

switch (msg.datab.cmd) {

case CMD_STOP_ALL:

messenger->sendmessage(finger_pid, CMD_FINGER_STOP);

sleep(1);

messenger->sendmessage(nose_pid, CMD_NOSE_STOP);

messenger->sendmessage(ear_pid, CMD_EAR_STOP);

messenger->sendmessage(voice_pid, CMD_VOICE_STOP);

stopping_all = true;

break;

case SAY_STARTED:

bcopy(&msg.datab.data, &pid, msg.datab.size);

printf("%d : PID = %d : Started!\n", msg.datab.pid, pid);

p_started++;

break;

case SAY_PAUSED:

bcopy(&msg.datab.data, &pid, msg.datab.size);

printf("%d : PID = %d : Paused!\n", msg.datab.pid, pid);

break;

case SAY_CONTINUED:

bcopy(&msg.datab.data, &pid, msg.datab.size);

printf("%d : PID = %d : Continued!\n", msg.datab.pid, pid);

break;

case SAY_STOPPED:

bcopy(&msg.datab.data, &pid, msg.datab.size);

printf("%d : PID = %d : Stopped!\n", msg.datab.pid, pid);

p_started--;

if (stopping_all)

OnStoppingAll();

break;

case CMD_NOSE_CONTINUE:

messenger->sendmessage(nose_pid, CMD_NOSE_CONTINUE);

break;

case CMD_NOSE_PAUSE:

messenger->sendmessage(nose_pid, CMD_NOSE_PAUSE);

break;

case CMD_NOSE_STOP:

messenger->sendmessage(nose_pid, CMD_NOSE_STOP);

wait(&status);

break;

case CMD_VOICE_CONTINUE:

messenger->sendmessage(voice_pid, CMD_VOICE_CONTINUE);

break;

case CMD_VOICE_PAUSE:

messenger->sendmessage(voice_pid, CMD_VOICE_PAUSE);

break;

case CMD_VOICE_STOP:

messenger->sendmessage(voice_pid, CMD_VOICE_STOP);

wait(&status);

break;

case CMD_EAR_CONTINUE:

messenger->sendmessage(ear_pid, CMD_EAR_CONTINUE);

break;

case CMD_EAR_PAUSE:

messenger->sendmessage(ear_pid, CMD_EAR_PAUSE);

break;

case CMD_EAR_STOP:

messenger->sendmessage(ear_pid, CMD_EAR_STOP);

wait(&status);

break;

case CMD_FINGER_CONNECT:

messenger->sendmessage(finger_pid, CMD_FINGER_CONNECT, msg.datab.data, msg.datab.size);

break;

case CMD_FINGER_RECONNECT:

messenger->sendmessage(finger_pid, CMD_FINGER_RECONNECT, msg.datab.data, msg.datab.size);

break;

case CMD_FINGER_DISCONNECT:

messenger->sendmessage(finger_pid, CMD_FINGER_DISCONNECT);

break;

case CMD_FINGER_STOP:

messenger->sendmessage(finger_pid, CMD_FINGER_STOP);

wait(&status);

break;

case INFO_EAR_SOMEBODY_HAS_BIGGER_WEIGHT:

messenger->sendmessage(nose_pid, CMD_NOSE_CONNECT_CLIENTS_TO_ANOTHER_SERVER, msg.datab.data, msg.datab.size);

messenger->sendmessage(nose_pid, CMD_NOSE_PAUSE);

messenger->sendmessage(ear_pid, CMD_EAR_PAUSE);

messenger->sendmessage(voice_pid, CMD_VOICE_PAUSE);

messenger->sendmessage(head_pid, CMD_HEAD_BECOME_PASSIVE, msg.datab.data, msg.datab.size);

break;

case INFO_FINGER_SERVER_LOST:

messenger->sendmessage(nose_pid, CMD_NOSE_CONTINUE);

messenger->sendmessage(ear_pid, CMD_EAR_CONTINUE);

messenger->sendmessage(voice_pid, CMD_VOICE_CONTINUE);

messenger->sendmessage(head_pid, CMD_HEAD_BECOME_ACTIVE);

break;

}

}

CBrain::~CBrain()

{

messenger->deletequeue();

delete messenger;

}

#include "cbrain.h"

int main(int argc, char *argv[])

{

CBrain* brain = new CBrain();

brain->Init();

delete brain;

return 0;

}

Модуль широковещательной рассылки информации:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <../conf/config.h>

#include <sys/wait.h>

#include <signal.h>

#include <../interfaces/ibroadcastserver.h>

class CBroadcastServer{

public:

CBroadcastServer(int port);

void startlisten();

void stoplisten();

void messagereceived(char* msg, int len);

void SetExObjOnMsgReceived(IBroadcastServer* lExObjOnMsgReceived);

~CBroadcastServer();

private:

int sock;

int cpid;

struct sockaddr_in sa;

IBroadcastServer* ExObjOnMsgReceived;

};

#include "cbroadcastserver.h"

CBroadcastServer::CBroadcastServer(int port)

{

sa.sin_addr.s_addr = INADDR_ANY;

sa.sin_port = htons(BROADCAST_PORT);

cpid = -1;

}

void CBroadcastServer::SetExObjOnMsgReceived(IBroadcastServer* lExObjOnMsgReceived)

{

ExObjOnMsgReceived = lExObjOnMsgReceived;

}

void CBroadcastServer::messagereceived(char* msg, int len)

{

ExObjOnMsgReceived->FuncOnMsgReceived(msg, len);

}

void CBroadcastServer::startlisten()

{

int optval = 1;

sock = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);

if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &optval, sizeof optval) == -1) {

perror("CBroadcastServer: Error calling setsockopt()");

return;

}

if (bind(sock,(struct sockaddr *)&sa, sizeof(struct sockaddr)) != 0) {

perror("CBroadcastServer: Error calling bind()");

return;

}

cpid = fork();

if (cpid < 0) {

perror("CBroadcastServer: Error calling fork()");

return;

} else if (cpid == 0) {

while (1) {

char msg[MAX_MSG_SIZE];

int recsize;

socklen_t fromlen;

fromlen = sizeof(sa);

if ((recsize = recvfrom(sock, (void *)msg, MAX_MSG_SIZE, 0, (struct sockaddr *)&sa, &fromlen)) < 0) {

perror("CBroadcastServer: Error calling recvfrom()");

return;

}

messagereceived(msg, recsize);

}

}

}

void CBroadcastServer::stoplisten()

{

if (cpid > 0) {

kill(cpid, SIGHUP);

int status;

wait(&status);

close(sock);

}

cpid = -1;

}

CBroadcastServer::~CBroadcastServer()

{

stoplisten();

}

Модуль обслуживания сообщений:

#include "../conf/config.h"

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <strings.h>

#include <unistd.h>

#define CMD_STOP_ALL 0

#define SAY_STARTED 1

#define SAY_PAUSED 2

#define SAY_CONTINUED 3

#define SAY_STOPPED 4

#define CMD_VOICE_CONTINUE 10

#define CMD_VOICE_PAUSE 11

#define CMD_VOICE_STOP 12

#define CMD_EAR_CONTINUE 20

#define CMD_EAR_PAUSE 21

#define CMD_EAR_STOP 22

#define INFO_EAR_SOMEBODY_HAS_BIGGER_WEIGHT 200

#define CMD_NOSE_CONTINUE 30

#define CMD_NOSE_PAUSE 31

#define CMD_NOSE_STOP 32

#define CMD_NOSE_CONNECT_CLIENTS_TO_ANOTHER_SERVER 300

#define INFO_NOSTRILL_CLIENT_LOST 350

#define CMD_NOSTRILL_DISCONNECT 360

#define CMD_NOSTRILL_SENDDATA 361

#define CMD_FINGER_CONNECT 40

#define CMD_FINGER_DISCONNECT 41

#define CMD_FINGER_RECONNECT 42

#define CMD_FINGER_STOP 43

#define INFO_FINGER_SERVER_LOST 400

#define INFO_FINGER_CONNECT 401

#define INFO_FINGER_DISCONNECT 402

#define CMD_HEAD_CONTINUE 50

#define CMD_HEAD_PAUSE 51

#define CMD_HEAD_STOP 52

#define CMD_HEAD_BECOME_ACTIVE 500

#define CMD_HEAD_BECOME_PASSIVE 501

#include <../interfaces/imessenger.h>

class CMessenger{

public:

CMessenger();

void startlisten();

void startlisten(int pid);

void stoplisten();

void messagereceived(Message msg);

void sendmessage(long lcmd);

void sendmessage(long lcmd, char* data, int data_sz);

void sendmessage(int pid, long lcmd, void* data, int data_sz);

void sendmessage(int pid, long lcmd);

void setExObjOnMsgRcv(IMessenger* lExObjOnMsgRcv);

void deletequeue();

~CMessenger();

private:

int msgid;

bool cont;

IMessenger* ExObjOnMsgRcv;

};

#include "cmessenger.h"

CMessenger::CMessenger()

{

key_t key;

if ((key = ftok(KEY_FILE, 'A')) < 0) {

perror("CMessenger: error calling ftok()");

return;

}

if ((msgid = msgget(key, 0666 | IPC_CREAT)) < 0) {

perror("CMessenger: error calling msgget()");

return;

}

cont = false;

ExObjOnMsgRcv = NULL;

}

void CMessenger::setExObjOnMsgRcv(IMessenger* lExObjOnMsgRcv)

{

ExObjOnMsgRcv = lExObjOnMsgRcv;

}

void CMessenger::startlisten()

{

Message msg;

msg.mtype = BRAIN_MSG_ID;

cont = true;

while (cont) {

if (msgrcv(msgid, &msg, sizeof(msg), msg.mtype, 0) < 0) {

perror("CMessenger: error calling msgrcv()");

return;

}

messagereceived(msg);

}

return;

}

void CMessenger::startlisten(int pid)

{

Message msg;

msg.mtype = pid;

cont = true;

while (cont) {

if (msgrcv(msgid, &msg, sizeof(msg), msg.mtype, 0) < 0) {

perror("CMessenger: error calling msgrcv()");

return;

}

messagereceived(msg);

}

return;

}

void CMessenger::stoplisten()

{

cont = false;

return;

}

void CMessenger::messagereceived(Message msg)

{

if (ExObjOnMsgRcv != NULL) {

ExObjOnMsgRcv->FuncOnMsgRcv(msg);

}

}

void CMessenger::sendmessage(long lcmd)

{

Message msg;

msg.mtype = BRAIN_MSG_ID;

msg.datab.cmd = lcmd;

bzero(msg.datab.data, MAX_MSG_DATA_SIZE);

msg.datab.size = 0;

msg.datab.pid = getpid();

if (msgsnd(msgid, (void *)&msg, sizeof(msg.datab), 0) !=0) {

perror("CMessenger: Error calling msgsnd()");

return;

}

return;

}

void CMessenger::sendmessage(long lcmd, char* data, int data_sz)

{

Message msg;

msg.mtype = BRAIN_MSG_ID;

msg.datab.cmd = lcmd;

msg.datab.size = data_sz;

msg.datab.pid = getpid();

if (msg.datab.size > MAX_MSG_DATA_SIZE) {

perror("CMessenger: Error trying to send message: data to send is too large!");

return;

}

bcopy(data, msg.datab.data, data_sz);

if (msgsnd(msgid, (void *)&msg, sizeof(msg.datab), 0) !=0) {

perror("CMessenger: Error calling msgsnd()");

return;

}

return;

}

void CMessenger::sendmessage(int pid, long lcmd, void* data, int data_sz)

{

Message msg;

msg.mtype = pid;

msg.datab.cmd = lcmd;

msg.datab.size = data_sz;

msg.datab.pid = getpid();

if (msg.datab.size > MAX_MSG_DATA_SIZE) {

perror("CMessenger: Error trying to send message: data to send is too large!");

return;

}

bcopy(data, msg.datab.data, data_sz);

if (msgsnd(msgid, (void *)&msg, sizeof(msg.datab), 0) !=0) {

perror("CMessenger: Error calling msgsnd()");

return;

}

return;

}

void CMessenger::sendmessage(int pid, long lcmd)

{

Message msg;

msg.mtype = pid;

msg.datab.cmd = lcmd;

bzero(msg.datab.data, MAX_MSG_DATA_SIZE);

msg.datab.size = 0;

msg.datab.pid = getpid();

if (msgsnd(msgid, (void *)&msg, sizeof(msg.datab), 0) !=0) {

perror("CMessenger: Error calling msgsnd()");

return;

}

return;

}

void CMessenger::deletequeue()

{

if (msgctl(msgid, IPC_RMID, 0) < 0) {

perror("CMessenger: error calling msgctl()");

return;

}

}

CMessenger::~CMessenger()

{

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.