.RU

Другие средства контроля - Отчет пленарному заседанию по пункту 3 ссылка(И)



^ Другие средства контроля


Первый необходимый шаг должен заключаться в проверке правильности соединения IP. Для получения более подробной информации о том, что в действительности происходит, могут быть использованы и другие средства. Существует большое количество вариантов. Можно использовать анализаторы протокола и средства программного обеспечения, основанные на SNMP. Например, сочетание Sun Microsystems и Solaris дает средство под названием “snoop”, которое в большинстве случаев может заменять анализатор местной сети. Другие средства, такие как TCPDUMP, доступны в Интернете бесплатно и могут быть инсталлированы в различные системы. TCPDUMP часто включаются в различные дистрибуции Linux. Эти средства требуют довольно хорошего знания протокола IP. В то же время, например, TCPDUMP может использоваться для диагностики проблем на уровне приложений.


Ниже приведен простой пример захвата хост-компьютером “pontiac” сообщений, участвующих в обмене на основе протокола ICMP между zinder и cadillac:


pontiac# /usr/local/bin/tcpdump -i nf0 host cadillac and zinder and proto icmp

15:28:06.68 cadillac.meteo.fr > zinder.meteo.fr: icmp: echo request

15:28:06.68 zinder.meteo.fr > cadillac.meteo.fr: icmp: echo reply

15:28:19.45 cadillac.meteo.fr > zinder.meteo.fr: icmp: echo request

15:28:19.45 zinder.meteo.fr > cadillac.meteo.fr: icmp: echo reply

15:28:29.44 cadillac.meteo.fr > zinder.meteo.fr: icmp: echo request

15:28:29.45 zinder.meteo.fr > cadillac.meteo.fr: icmp: echo reply


SNMP


Простой протокол управления сетью (SNMP) был разработан в конце 1980-х годов для того, чтобы предоставить в распоряжение администратора сети стандартное средство для контроля сети. В большинстве случаев протокол SNMP можно использовать для замены более простых, описанных выше средств. К сожалению, хорошее программное обеспечение SNMP стоит дорого. SNMP - это протокол типа «клиент/сервер». Чтобы иметь возможность собирать информацию при помощи SNMP, оборудование, включенное в сеть, должно иметь информационную базу для управления (MIB). Эти базы включают каталоги целых чисел, счетчики, строки и т. д. Администратор просит агентов направлять ему некоторые значения. Этими значениями может быть, например, таблица маршрутизации IP. Ниже приведен пример информации, полученной при запросе с помощью “НР Open View” (коммерческий пакет) о таблице маршрутизации у хост-компьютера monica.meteo.fr.


Название: monica.meteo.fr

Имя или адрес IP: monica.meteo.fr

IpRouteDest ipRouteMask ipRouteNextHop ipRouteProto ipRouteMetric1

0.0.0.0 0.0.0.0 137.129.1.5 local 0

136.156.0.0 255.255.0.0 137.129.1.5 ciscoIgrp 8786

137.129.1.0 255.255.255.0 137.129.1.6 local 0

137.129.2.0 255.255.255.0 137.129.1.5 ciscoIgrp 1110

137.129.3.0 255.255.255.0 137.129.3.254 local 0

137.129.4.0 255.255.255.0 137.129.4.254 local 0

137.129.5.0 255.255.255.0 137.129.5.254 local 0

137.129.6.0 255.255.255.0 137.129.1.62 local 0

137.129.7.0 255.255.255.0 137.129.7.254 local 0

137.129.8.0 255.255.255.0 137.129.8.254 local 0

137.129.9.0 255.255.255.0 137.129.1.5 ciscoIgrp 1110


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


На двусторонней основе центрам может быть полезно разрешить доступ SNMP к их маршрутизатору из других НМЦ. В то же время следует избегать регулярного опроса маршрутизаторов других центров в целях предотвращения перегрузки линий связи.


MRTG


Еще один пакет свободно копируемых программ под названием MRTG является очень полезным инструментом для сбора информации о местной сети и о соединенных линиях связи. Графопостроитель многомаршрутного трафика (MRTG) - это инструмент для контроля объема трафика в сети и на линиях связи. Он создает страницы HTML, на которых представлены изображения, дающие живое визуальное представление о трафике. Эта программа может быть также настроена таким образом, чтобы указывать на сбои в функционировании линий связи в сети. Пакет программ MRTG состоит из командного файла Perl, который использует протокол SNMP для считывания данных со счетчиков трафика вашего маршрутизатора(ов) и быстродействующей программы С, которая регистрирует данные о трафике и создает графики, дающие представление о трафике на контролируемом(ых) соединении(ях) сети. Ниже представлен пример выходной продукции. На нем приведены статистические данные о трафике на выделенной линии связи, а также информация о структуре трафика на этой линии. Это всего лишь один из множества графиков, которые можно создавать с помощью MRTG. Больше информации о MRTG содержится по адресу: http://oss.oetiker.ch/mrtg/.


Рис. 5.2.2.1 Пример графика MRTG




SYSLOG


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


Существует восемь различных уровней сообщений, которые маршрутизатор будет записывать на сервер SYSLOG, а именно:


Аварийные ситуации 0 Система непригодна для использования

Сигналы опасности 1 Необходимы немедленные действия

Критические сообщения 2 Критические условия

Ошибки 3 Состояние ошибки

Предупреждения 4 Условия предупреждения

Извещения 5 Нормальные, но важные условия

Информационные сообщения 6 Только информационные сообщения

Отладка 7 Сообщения с информацией для проведения отладки


Устройство для регистрации по умолчанию на маршрутизаторе Cisco установлено на “local7”; что важно знать при конфигурировании хост-компьютера, который должен служить в качестве сервера syslog. Соответствующие объяснения приводятся ниже.


Команды конфигурации на маршрутизаторе Cisco для активации регистрации представляют собой следующие:


cisco-gts-1(config)#logging trap level-of-messages-to-log

cisco-gts-1(config)#logging 141.38.48.12


и могут быть проверены с помощью команды «показать регистрацию»:


cisco-gts-1#sho logging

Регистрация syslog: разрешена (0 сообщений отброшено, 0 смещений, 0 перегрузок)

Регистрация на консоле: уровень отладки, 117892 сообщения зарегистрированы

Регистрация на контрольном устройстве: уровень отладки, 8317 сообщений зарегистрировано

Регистрация в ловушке: уровень отладки, зарегистрировано 117150 строк сообщений

Регистрация в 141.38.48.12, зарегистрировано 117150 строк сообщений

Регистрация в буфере: блокирована

cisco-gts-1#


В этом примере регистрация установлена на уровень отладки («отладка регистрации в ловушке»), и все сообщения от уровня 7 до уровня 0 будут посылаться на сервер syslog с помощью адреса IP 141.38.48.12.


Для активизации сервера SYSLOG, например на компьютере SGI UNIX, следует применить следующие команды:


в файле /etc/services: syslog 514/udp

в файле /etc/syslog.conf: local7.debug /usr/people/cisco/logs/cisco.log


Устройство отладки “local7” относится к устройству регистрации по умолчанию, которое определено маршрутизатором Сisco, как это уже упомянуто (local7). Упомянутый выше файл - это файл, в который демон syslog записывает все входящие сообщения syslog для “local7”.


Последнее действие на хост-компьютере направлено на то, чтобы демон syslog повторно прочитал свой файл конфигурации (kill -1 pid-of-syslogd).


Управление полосой пропускания


В сети IP все пакеты будут направляться по линиям связи без участия какого либо механизма назначения приоритетов. Вследствие этого передачи FTP могут занять всю имеющуюся полосу пропускания, препятствуя всем другим приложениям. В случае увеличения трафика, вероятно, придется вводить управление полосой пропускания в конфигурации сети. Дополнительную информацию по этому вопросу можно получить на оперативном справочном сайте (http://www.wmo.chint/).


^ ПРИЛОЖЕНИЕ 1 - ТОПОЛОГИЯ ВЫСОКОГО УРОВНЯ TCP/IP И ПОТОКИ ДАННЫХ TCP/IP


На следующих схемах показана топология высокого уровня простого центра и основные потоки данных, связанных с телесвязью по ГСТ и Интернет. Более подробные конфигурации X.25 по IP показаны в следующих приложениях.


Рисунок A1.1. Общая взаимосвязь между центрами




Рисунок A1.2. Топология сети TCP/IP в простом центре




Рисунок A1.3. Поток данных трафика по ГСТ — только IP




Рисунок A1.4. Поток данных трафика по ГСТ — X.25 на IP


Рисунок A1.5. Поток данных трафика с использованием ВЧС через Интернет




^ ПРИЛОЖЕНИЕ 2 - КОНФИГУРАЦИЯ МАРШРУТИЗАТОРА CISCO


Конфигурации маршрутизаторов, представленные в данном приложении являются примерами и не должны рассматриваться как предложение сделать Cisco единственным поставщиком, способным обеспечить функционирование.


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


Представленная ниже конфигурация соответствует инструкциям, имеющимся в версии 11.1 программного обеспечения Cisco IOS. Некоторые характеристики отсутствуют в предшествующих версиях, а некоторые будут изменены в будущем.


Далее идет описание различных этапов:


1. Установка соединения IP:


2. Конфигурация маршрутизации:


3. Конфигурация защиты:


В нашем примере центр А соединен с центром В с помощью протокола IP по линии связи Х.25, а центр В соединен с центром С с помощью протокола IP по линии связи РРР4. Существует также вариант, когда СКС в центрах В и С осуществляют связь посредством Х.25 по TCP/IP. Центр А - это терминальный узел, а центры В и С - нетерминальные узлы. В и С подсоединены также к Интернету. В и его Интернет-провайдер используют статическую маршрутизацию5, центр С и его Интернет-провайдер используют протокол RIP6.





В настоящем приложении будут применяться следующие элементы:




Адрес маршрутизатора IP

Адрес хост-компьютеров IP для ГСТ

Автономная система

ЦЕНТР B

193.105.177.2

193.105.178.5

137.129.9.0/255.255.255.0

65001

ЦЕНТР C

193.105.178.6

195.1.1.0/255.255.255.0

65200


В центре В для подсоединения к коммутаторам пакетов используется последовательный интерфейс 0. В центрах В и С для связи РРР используется последовательный интерфейс 1.


^ Этап 1: Установление соединений


Центр А:

последовательный интерфейс 0

инкапсуляция Х25

! В зависимости от местной установки (виртуальные каналы,

! окна...) может потребоваться дополнительная конфигурация

адрес x25 01016661166666

адрес ip 193.105.177.1 255.255.255.0

!

x25 преобразовать в ip 193.105.177.2 01017771177777


Центр B:

последовательный интерфейс 0

инкапсуляция X25

адрес x25 01017771177777

! В зависимости от местной установки (виртуальные каналы,

! окна...) может потребоваться дополнительная конфигурация

адрес ip 193.105.177.2 255.255.255.0

!

x25 преобразовать в ip 193.105.177.1 01016661166666

!

последовательный интерфейс 1

инкапсуляция PPP

адрес ip 193.105.178.5 255.255.255.252

!

! команды Х25 по ТСР

маршрутизация х25

маршрут x25 010177711* ip 193.105.178.5

маршрут x25 010188811* последовательный интерфейс 0


Центр C:

последовательный интерфейс 0

инкапсуляция X25

адрес x25 01018881188888

! В зависимости от местной установки (виртуальные каналы,

! окна...) может потребоваться дополнительная конфигурация

последовательный интерфейс 1

инкапсуляция PPP

адрес ip 193.105.178.6 255.255.255.252

!

! команды Х25 по ТСР

маршрутизация х25

маршрут x25 010177711* ip 193.105.178.5

маршрут x25 010188811* последовательный интерфейс 0


После этого первого этапа конфигурация IP между маршрутизаторами завершена. Затем маршрутизатор в центре А может провести проверку по методу «запрос-ответ» в отношении маршрутизатора центра В. Центр В может провести проверку по методу «запрос-ответ» в отношении А и С, однако центры А и С не могут осуществлять связь, поскольку между ними не установлен маршрут.


СКС в центрах В и С могут осуществлять связь посредством IP (после проведения маршрутизации между конечными пунктами) или посредством Х.25 по ТСР. Опыт показал, что все параметры Х.25 маршрутизаторов центров В и С ДОЛЖНЫ БЫТЬ одинаковыми (размер пакетов, размер окон), чтобы предотвратить неточности в работе.


Этап 2: Маршрутизация

Центр А:

! Просто определить маршрут, используемый по умолчанию, посредством десятичной системы (цена) через центр В

маршрут ip 0.0.0.0 255.255.255.255 193.105.177.2 10


Центр В:

! Определить сначала статический маршрут с центром А

маршрут ip 194.168.1.16 255.255.255.248 193.105.177.1 10

маршрут ip 0.0.0.0 адрес провайдера ip 10

! определить маршрут, используемый по умолчанию к Интернет

маршрут ip 0.0.0.0 0.0.0.0 адрес провайдера Интернет 10

! маршрутизация с протоколом BGP

маршрутизатор bgp 65001

сеть 137.129.9.0 маска 255.255.255.0

сосед 193.105.178.6 удаленная АС 65200

! Маршрут к центру А статичен, обеспечение передачи к центру С

статическое перераспределение


Центр C:

! маршрутизация с протоколом BGP

маршрутизатор bgp 65200

сеть 195.1.1.0

сосед 193.105.178.5 удаленная АС 65001

! 196.1.1.0 - это адрес в сети для хост-компьютеров в центре С, не входящих в ГСТ

маршрутизатор с протоколом rip

версия 2

сеть 195.1.1.0

никакого автоматического подведения итогов


Центр А определяет маршрут, используемый по умолчанию. Таким образом, когда центр А хочет осуществить связь с центром С, маршрутизатор знает, куда направлять пакеты. Центр С должен получать информацию о маршруте из центра В, то центр А может быть также достигнут из центра С. Важно отметить также, что если центр А пытается выйти на какой-либо сайт Интернета, то эти попытки будут осуществляться через соединение центра В с Интернетом. Эти попытки окончатся неудачей, поскольку сайт Интернета, которого пытается достичь центр А, не может возвращать пакеты в центр А (через соединение центра В с Интернетом для сайта Интернета достижим только адрес центра В). Таким образом, по связи между А и В будут передаваться некоторые несоответствующие данные. Обратите внимание также, что мы используем версию 2 протокола RIP.


Этап 3: Безопасность

Центр A:

! Объявить хост-компьютеры, которые могут использовать ГСТ

разрешение списка доступа 1 194.168.1.16 0.0.0.7

! Объявить хост-компьютеры, данные которых могут исходить из ГСТ

разрешение списка доступа 2 195.1.1.0 0.0.0.255

разрешение списка доступа 2 137.129.9.0 0.0.0.255

!

последовательный интерфейс 0

группа доступа ip 1 “из”

группа доступа ip 2 “в”


Центр B:

! Объявить хост-компьютеры, которые могут использовать ГСТ

разрешение списка доступа 1 137.129.9.0 0.0.0.255

! Объявить хост-компьютеры, данные которых могут исходить из ГСТ

разрешение списка доступа 2 195.1.1.0 0.0.0.255


! принимать модификации BGP только из АС соседа

разрешение списка доступа 3 маршрута АС для IP ^$

разрешение списка доступа 3 маршрута АС для IP ^65200

!

последовательный интерфейс 0

группа доступа ip 1 “из”

группа доступа ip 2 “в”

!

последовательный интерфейс 1

группа доступа ip 1 “из”

группа доступа ip 2 “в”

! Ограничить модификации BGP

маршрутизатор bgp 65001

сеть 137.129.9.0 маска 255.255.255.0

сосед 193.105.178.6 удаленная АС 65200

сосед 193.105.178.6 список-фильтр 3 “в”

сосед 193.105.178.6 список-фильтр 3 “из”

статическое перераспределение


Центр C:

! Объявить хост-компьютеры, которые могут использовать ГСТ

разрешение списка доступа 1 195.1.1.0 0.0.0.255

! Объявить хост-компьютеры, данные которых могут исходить из ГСТ

разрешение списка доступа 2 137.129.9.0 0.0.0.255


! Принимать модификации BGP только из АС соседа

разрешение списка доступа 3 маршрута АС для IP ^$

разрешение списка доступа 3 маршрута АС для IP ^65001

!

последовательный интерфейс 0

группа доступа ip 1 “из”

группа доступа ip 2 “в”

! Ограничить модификации BGP

маршрутизатор bgp 65200

последовательный интерфейс 0

группа доступа ip 1 “из”

группа доступа ip 2 “в”

! Ограничить модификации BGP

маршрутизатор bgp 65200

сеть 195.1.1.0 маска 255.255.255.0

сосед 193.105.178.5 удаленная АС 65001

сосед 193.105.178.5 список-фильтр 3 “в”

сосед 193.105.178.5 список-фильтр 3 “из”


В этих конфигурациях используются две важные характеристики:


a) Фильтрация BGP


Список доступа 3 как в центре В, так и центре С проверяет номер автономной системы, посылаемый его соседом. В результате фильтрации на входе и выходе в процессе BGP это является гарантией того, что все известные маршруты выдаются одной из этих АС.


b) Фильтрация IP


Список доступа 1 санкционирует адреса IP, выдаваемые из каждого центра. Этот список должен быть весьма стабильным. Список доступа 2 проверяет входящие адреса IP. По мере того, как в сети IP добавляются новые центры, соответствующие адреса должны добавляться к этим спискам доступа.


Необходимо отметить, что несмотря на наличие соединений с Интернетом в центрах В и С, для контроля за обменом по маршрутам не требуется какого-либо дополнительного внимания. Статический маршрут, избранный по умолчанию, не устанавливается, даже если задействуется «статическое перераспределение». RIP и BGP не реагируют на информацию о маршрутизации, поступающую через другой протокол.

^ ПРИЛОЖЕНИЕ 3 - ПРИМЕР ПРОГРАММЫ ПЕРЕДАЧИ И ПРИЕМА ИНФОРМАЦИИ ПРИ ПОМОЩИ СОКЕТОВ

/*********************************************************************************************************

* Пример программы, которая ОТПРАВЛЯЕТ одно сообщение через сокет TCP/IP.

*********************************************************************************************************/

#include

#include

#include

#include

#include

#include

#include

#include

#include


/* АДРЕСАТ TCP/IP и СЕРВИС ОПРЕДЕЛЯЮТСЯ ПРИНИМАЮЩИМ ЦЕНТРОМ */

#define DESTINATION "localhost"

#define SERVICE 39000

#define GTS_LENFIELD 8

#define MAX_MSGSIZE 15000 /* рекомендуемый размер пересылочного буфера: 4096 */


static void GetDestinationInfo();

static void SetupSocket();

static void SendData();

static void MakeConnection();


static struct sockaddr_in dest;

static int pr_sock;


/********************************************************************************************************

* ОСНОВНАЯ ПРОГРАММА (MAINLINE)

* 1. Не обращайте внимания на сигналы SIGPIPE. Они появляются в случае

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

* 2. Получите информацию об пункте назначения (GetDestinationInfo):

* - номер (и имя) IP

* - номер сервиса и порта

* 3. Создайте сокет TCP/IP (SetupSocket)

* 4. Соединитесь с центром назначения (MakeConnection)

* 5. Отправьте сообщение (SendData)

* 6. Закройте сокет (shutdown + close)

********************************************************************************************************/

main(int argc, char *argv[])

{


signal (SIGPIPE,SIG_IGN);


GetDestinationInfo();

SetupSocket();

MakeConnection();

SendData();

/* shutdown(pr_sock,1) */

close(pr_sock);


}


/********************************************************************************************************

* ПОЛУЧЕНИЕ ИНФОРМАЦИИ О ПУНКТЕ НАЗНАЧЕНИЯ (GET DESTINATION INFO)

* Сохраните адрес пункта назначения IP и номер сервиса в структуре сокета (dest).

* 1. Преобразуйте адрес пункта назначения в номер IP (gethostbyname).

* 2. Сохраните номер IP и номер сервиса в структуре "dest".

*******************************************************************************************************/

static void GetDestinationInfo()

{

struct hostent *hp;


hp = gethostbyname (DESTINATION);

if ( hp == NULL ) {

printf("host error\n");

exit(1);

}


memset ((char *)&dest, 0, sizeof dest);

memcpy (&dest.sin_addr.s_addr, hp->h_addr, hp->h_length);

dest.sin_family = AF_INET;

dest.sin_port = SERVICE;

}


/******************************************************************************************************

* УСТАНОВКА СОКЕТА (SETUP SOCKET)

* Установка сокета TCP/IP

* 1. Создайте сокет

* 2. Установите опцию сокета KEEPALIVE.

* Это позволяет осуществлять автоматическую периодическую передачу

* «проверочных» сообщений, которые следует направлять по данной линии.

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

* уведомление (посредством SIGPIPE или «конец файла»)

* 3. Установите опцию сокета REUSEADDR.

* Это обеспечит быстрый повторный запуск прерванных процессов.

* 4. Уменьшите объем буфера передачи сокета для снижения

* объема потерянных данных в случае прерывания соединения.

******************************************************************************************************/

static void SetupSocket()

{

int on = 1;

int rc;

int buffsize = MAX_MSGSIZE;


pr_sock = socket (AF_INET, SOCK_STREAM, 0);

if (pr_sock < 0) {

printf("sock error\n");

exit(1);

}


rc = setsockopt(pr_sock,SOL_SOCKET,SO_KEEPALIVE,(char *)&on,sizeof(on));

if (rc != 0) {

printf("keepalive error\n");

}


rc = setsockopt(pr_sock,SOL_SOCKET,SO_REUSEADDR,(char *)&on,sizeof(on));

if (rc != 0) {

printf("reuse error\n");

}


rc = setsockopt(pr_sock,SOL_SOCKET,SO_SNDBUF,(char *)&buffsize,sizeof(buffsize));

if (rc != 0) {

printf("unable to set send buffer size\n");

}


}


/********************************************************************************************************

* УСТАНОВЛЕНИЕ СОЕДИНЕНИЯ (MAKE CONNECTION)

* Попытайтесь посредством сокета TCP/IP установить соединение

* с пунктом назначения по согласованному номеру сервиса/порта.

********************************************************************************************************/

static void MakeConnection()

{

int length;

length = sizeof (dest);

if ( connect (pr_sock,(struct sockaddr *)&dest,length) == -1 ) {

printf("connection error\n");

exit(1);

}


printf("connected\n");

}


/********************************************************************************************************

* ПОСЫЛКА ДАННЫХ (SEND DATA)

* Направьте сообщение в сокет (фактически 5 раз).

* ПРИМЕЧАНИЕ. Реальная программа проверит код завершения записи,

* и если запись не удалась, она закроет сокет, пошлет сигнал тревоги

* оператору, а затем попытается вновь отправить сообщение с самого начала

********************************************************************************************************/

static void SendData()

{

char msg[MAX_MSGSIZE+1], buffer[MAX_MSGSIZE+GTS_LENFIELD+3];

int buflen, i, rc = 0;


strcpy(msg,"\001\r\r\n001\r\r\nTTAA01 AMMC 000000\r\r\n");

for (i=0;i<60;i++)

strcat(msg,"THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 0123456789\r\r\n");

strcat(msg,"\r\r\n\003");


sprintf(buffer,"%0*dAN%s",GTS_LENFIELD,strlen(msg),msg);

buflen = strlen(buffer);


for (i=0; i<5; i++) {

rc = write(pr_sock,buffer,buflen);

printf("write. rc = %d\n",rc);

}


}


/********************************************************************************************************

* ПРОВЕРКА ПРОГРАММЫ ПОЛУЧЕНИЯ СООБЩЕНИЙ СОКЕТА TCP/IP

* (TEST TCP/IP SOCKET RECEIVING PROGRAM).

* Программа предназначена для представления некоторых идей относительно

* того, каким образом принимать сообщения типа ГСТ через соединение сокета TCP/IP.

********************************************************************************************************/

#include

#include

#include

#include

#include

#include

#include

#include

#include


#define SERVICE 39000

#define MAX_MSGSIZE 15000

#define MAX_BUFLEN MAX_MSGSIZE + 100

#define SOH '\001'

#define ETX '\003'

#define GTS_LENFIELD 8

#define GTS_SOCKET_HEADER 10


static void SetupService();

static void RecvData();

static void AcceptConnection();

static int ExtractMsg(char *buffer, int *buflen);

static int CheckMsgBoundaries (char *, int);

static int FindMessage (char *, int, int *);

static void ShiftBuffer (char *, int *, int);


static struct sockaddr_in dest;


static int pr_sock, msgsock;

static char buffer[MAX_BUFLEN+1];

static int buflen = 0;


/********************************************************************************************************

* ОСНОВНАЯ ОПЕРАЦИЯ (MAIN)

* Проверьте поступление входных вызовов IP и прочитайте

* все входящие сообщения с первого установленного вызова.

* 1. Не обращайте внимания на сигналы SIGPIPE. Они появляются

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

* 2. Установите сокет для входящих сообщений (SetupService)

* 3. Примите первый полученный вызов (AcceptConnection)

* 4. Прочитайте все сообщения на этом соединении (RecvData)

* 5. Закончите связь и закройте сокет.

********************************************************************************************************/

main(int argc, char *argv[])

{


signal (SIGPIPE,SIG_IGN);


SetupService();

AcceptConnection();

RecvData();


close(msgsock);

/* shutdown(pr_sock,1) */

close(pr_sock);

}


/********************************************************************************************************

* СЕРВИС УСТАНОВКИ (SETUP SERVICE)

* Проверьте вызовы по заданному сервису/порту.

* 1. Создайте сокет.

* 2. Установите опцию KEEPALIVE.

* Это позволяет осуществлять автоматическую периодическую

* передачу «проверочных» сообщений, которые должны

* направляться по данной линии. Если пункт назначения не отвечает,

* он считается неисправным и об этом делается уведомление

* (посредством SIGPIPE или «конец файла»).

* 3. Установите опцию REUSEADDR сокета. Это обеспечит

* более быстрый повторный запуск прерванных процессов.

* 4. Еще раз подсоедините сокет к нужному сервису/порту.

* 5. Начните проверку поступления вызовов.

********************************************************************************************************/

static void SetupService()

{

int on = 1;

int rc;

/* adjust the TCP receive buffer size

int buffsize = MAX_MSGSIZE; */


memset ((char *)&dest, 0, sizeof dest);

dest.sin_addr.s_addr = INADDR_ANY;

dest.sin_family = AF_INET;

dest.sin_port = SERVICE;


pr_sock = socket (AF_INET, SOCK_STREAM, 0);

if (pr_sock < 0) {

printf("sock error\n");

exit(1);

}


rc = setsockopt(pr_sock,SOL_SOCKET,SO_KEEPALIVE,(char *)&on,sizeof(on));

if (rc != 0) {

printf("keepalive error\n");

exit(1);

}

rc = setsockopt(pr_sock,SOL_SOCKET,SO_REUSEADDR,(char *)&on,sizeof(on));

if (rc != 0) {

printf("reuse error\n");

exit(1);

}

/* adjust the TCP receive buffer size

rc = setsockopt(pr_sock,SOL_SOCKET,SO_RCVBUF,(char *)&buffsize,sizeof(buffsize));

if (rc != 0) {

printf("unable to set send receive size\n");

}

*/

rc = bind(pr_sock,(struct sockaddr *)&dest,sizeof dest);

if ( rc < 0) {

printf("bind error\n");

exit(1);

}


rc = listen(pr_sock,1);

if ( rc < 0) {

printf("listen error\n");

exit(1);

}


printf("listening\n");

}


/********************************************************************************************************

* СОЕДИНЕНИЕ ДЛЯ ПРИЕМА (ACCEPT CONNECTION)

* Подождите входящего вызова (принять).

* Верните сокет установленного вызова.

********************************************************************************************************/

static void AcceptConnection()

{

int addrlen;


printf("waiting connection\n");


addrlen = sizeof(sockaddr_in);

msgsock = accept (pr_sock,&dest,&addrlen);

if ( msgsock < 0) {

printf("accept error\n");

exit(1);

}

printf("connected\n");

}


/********************************************************************************************************

* ПРИЕМ ДАННЫХ (RECV DATA)

* Прочитайте данные из сокета сообщения/вызова.

* Выделите сообщения ГСТ из этих данных.

* Продолжайте чтение до тех пор, пока отправитель

* не прекратит вызов или не произойдет ошибка.

********************************************************************************************************/

static void RecvData()

{

int numr = 1;

int rc = 0;


while (numr > 0 && rc >= 0) {

numr = read(msgsock,buffer+buflen, MAX_BUFLEN-buflen);

if (numr > 0) {

buflen += numr;

buffer[buflen] = '\0';

printf("buffer = %s\n",buffer);

rc = ExtractMsg(buffer,&buflen);

}

}

}


/********************************************************************************************************

* ВЫДЕЛЕНИЕ СООБЩЕНИЙ (EXTRACT MSG)

* ОПИСАНИЕ

* Эта функция принимает на входе буфер данных, а также размер этого буфера,

* и выделяет сообщения ГСТ из этого буфера.

* Сообщения, которые находятся в буфере, идентифицируются следующим образом...

* Первые 8 байт сообщения из буфера ДОЛЖНЫ УКАЗЫВАТЬ

* длину сообщения в символьном формате.

* Если длина превышает установленный ГСТ максимальный размер

* сообщения или не состоит цифровых символов, появляется

* сообщение об ошибке (потеря синхронизации).

*

* Сразу после длины сообщения следует тип сообщения из двух символов:

* “AN” = буквенно-цифровой, “BI” = двоичный, “FX” = факсимильный.

*

* Сообщение ГСТ начинается символом SOH и заканчивается

* символом ЕТХ, а если этого не происходит, то появляется

* сообщение об ошибке (потеря синхронизации).

*

* Если сообщение ГСТ идентифицировано, оно выделяется

* и выводится из буфера.

*

* В случае наличия более одного сообщения в буфере

* эта функция повторяется (выделение сообщений) до тех пор,

* пока не выявляется либо ошибка, либо неполное сообщение.

*

* РЕЗУЛЬТАТЫ = 0 - Неполное сообщение в буфере.

* <0 - Неисправимая ошибка в формате буфера.

* >0 - Успешная операция - сообщение или сообщения выделены.


********************************************************************************************************/

static int ExtractMsg(char *buffer, int *buflen)

{

int rc, msglen;

char msg[MAX_MSGSIZE+1];


/* НАЙДИТЕ ПЕРВОЕ СООБЩЕНИЕ В БУФЕРЕ */

rc = FindMessage (buffer, *buflen, &msglen);

/* ЕСЛИ СООБЩЕНИЕ ПРАВИЛЬНОЙ ДЛИНЫ НАХОДИТСЯ В БУФЕРЕ... */

while ( rc > 0 ) {


/* ПРОВЕРЬТЕ, ЧТО ПЕРВЫМ СИМВОЛОМ ПОСЛЕ ДЛИНЫ СООБЩЕНИЯ ЯВЛЯЕТСЯ “SOH” И ЧТО ПОСЛЕДНИЙ УКАЗАННЫЙ ДЛИНОЙ СООБЩЕНИЯ СИМВОЛ - ЭТО “ETX”. */

if ( (rc = CheckMsgBoundaries (buffer, msglen)) < 0 )

continue;

/* НАПЕЧАТАЙТЕ ИЗВЛЕЧЕННОЕ СООБЩЕНИЕ*/

memcpy(msg,buffer+GTS_SOCKET_HEADER,msglen);

msg[msglen] = '\0';

printf("GTS MSG = \n%s\n",msg);

/* ВЫВЕДИТЕ ТОЛЬКО ЧТО ВЫДЕЛЕННОЕ СООБЩЕНИЕ ИЗ БУФЕРА И СДЕЛАЙТЕ ПОВТОР КОМАНД ДЛЯ ПОИСКА НОВОГО СООБЩЕНИЯ. */

ShiftBuffer (buffer, buflen, msglen);


/* НАЙДИТЕ ПЕРВОЕ СООБЩЕНИЕ В БУФЕРЕ ПОСЛЕ СДВИГА СООБЩЕНИЙ*/

rc = FindMessage (buffer, *buflen, &msglen);


}

return (rc);

}


/********************************************************************************************************

* ПОИСК СООБЩЕНИЯ (FIND MESSAGE)

* Проверьте, что сообщение в полном объеме находится в начале буфера.

* 1. Проверьте первые 8 символов, которые указывают длину сообщения.

* 2. Проверьте следующие 2 символа, которые указывают тип сообщения.

* 3. Проверьте, что сообщение в полном объеме, согласно

* определению в поле «длина сообщения», находится буфере.

* Коды возврата:

* 0 = неполное сообщение

* 1 = полное сообщение

* -1 = ошибка

********************************************************************************************************/

static int FindMessage (char *buffer, int buflen, int *mlen)

{

char charlen[GTS_LENFIELD+1];

int intlen;


*mlen = 0;


/* ЕСЛИ ДЛИНА ПРОШЕДШЕГО СООБЩЕНИЯ В БУФЕРЕ МЕНЕЕ 10 СИМВОЛОВ, ВОЗВРАТ «НЕПОЛНЫЙ». */

if ( buflen < GTS_SOCKET_HEADER ) {

return (0);

}


/* ПРОВЕРЬТЕ ПРАВИЛЬНОСТЬ ТИПА СООБЩЕНИЯ */

if (strncmp(buffer+GTS_LENFIELD,"AN",2) && strncmp(buffer+GTS_LENFIELD,"BI",2) && strncmp(buffer+GTS_LENFIELD,"FX",2)) {

printf("ERROR: Message Type field invalid");

return (-1);

}


/* ВЫДЕЛИТЕ ДЛИНУ СООБЩЕНИЯ */

strncpy (charlen, buffer, GTS_LENFIELD);

charlen[GTS_LENFIELD] = '\0';


/* ПРОВЕРЬТЕ, ЧТО ПОЛОСА СИМВОЛОВ, УКАЗЫВАЮЩАЯ ДЛИНУ СООБЩЕНИЯ, СОСТОИТ ПОЛНОСТЬЮ ИЗ ЦИФР. УКАЖИТЕ ОШИБКУ, ЕСЛИ ДЕЛО ОБСТОИТ ИНАЧЕ. */

if ( strspn (charlen, "0123456789") != strlen (charlen) ) {

printf("ERROR: length not numeric");

return (-1);

}

/* ПРЕОБРАЗУЙТЕ ПОЛОСУ СИМВОЛОВ, УКАЗЫВАЮЩУЮ ДЛИНУ СООБЩЕНИЯ, В ЦЕЛОЕ ЧИСЛО. */

intlen = atoi (charlen);

/* ПРОВЕРЬТЕ, ЧТО ДЛИНА СООБЩЕНИЯ, ВЫДЕЛЕННОГО ИЗ БУФЕРА, НЕ ПРЕВЫШАЕТ УСТАНОВЛЕННЫЙ ГСТ МАКСИМАЛЬНЫЙ РАЗМЕР СООБЩЕНИЯ. УКАЖИТЕ ОШИБКУ, ЕСЛИ ДЕЛО ОБСТОИТ ИНАЧЕ. */

if ( intlen >^ MAX_MSGSIZE ) {

printf("ERROR: message overlength");

return (-1);

}


/* ПРОВЕРЬТЕ, ПОЛУЧЕНО ЛИ ВСЕ СООБЩЕНИЕ ЦЕЛИКОМ. СДЕЛАЙТЕ ВОЗВРАТ, ЕСЛИ ДЕЛО ОБСТОИТ ИНАЧЕ*/

if ( buflen < intlen + GTS_SOCKET_HEADER ) {

return (0);

}


*mlen = intlen;

return (1);

}


/********************************************************************************************************

* ПРОВЕРЬТЕ ГРАНИЦЫ СООБЩЕНИЯ (CHECK MSG BOUNDARIES)

* Подтвердите, что первый символ после заголовка сокета - это SOH и что

* последним символом сообщения (соответствующим длине сообщения) является ЕТХ.

********************************************************************************************************/

static int CheckMsgBoundaries (char *buffer, int msglen)

{


/* ПРОВЕРЬТЕ, ЧТО ПЕРВЫМ СИМВОЛОМ (ПОСЛЕ ПОЛЯ, УКАЗЫВАЮЩЕГО ДЛИНУ СООБЩЕНИЯ) ЯВЛЯЕТСЯ СИМВОЛ SOH. УКАЖИТЕ ОШИБКУ, ЕСЛИ ДЕЛО ОБСТОИТ ИНАЧЕ. */

if ( buffer[GTS_SOCKET_HEADER] != SOH ) {

printf("ERROR: SOH not found\n");

return (-1);

}

/* ПРОВЕРЬТЕ, ЧТО ПОСЛЕДНИМ СИМВОЛОМ (В СООТВЕТСТВИИ С ПОЛЕМ, УКАЗЫВАЮЩИМ ДЛИНУ СООБЩЕНИЯ) ЯВЛЯЕТСЯ СИМВОЛ ЕТХ. УКАЖИТЕ ОШИБКУ, ЕСЛИ ДЕЛО ОБСТОИТ ИНАЧЕ. */

if ( buffer[msglen+GTS_SOCKET_HEADER-1] != ETX ) {

printf("ERROR: ETX not found\n");

return (-1);

}


return (1);

}


/********************************************************************************************************

* СДВИГ СООБЩЕНИЙ В БУФЕРЕ (SHIFT BUFFER)

* Выведите из буфера главное сообщение, которое там находится.

* После этого буфер либо свободен, либо часть нового сообщения

* или оно все целиком перемещается в его начало.

********************************************************************************************************/

static void ShiftBuffer (char *buffer, int *buflen, int msglen)

{

int shiftlen;


/* РАССЧИТАЙТЕ ОБЪЕМ ДАННЫХ, КОТОРЫЕ ДОЛЖНЫ БЫТЬ ВЫВЕДЕНЫ ИЗ БУФЕРА. */

shiftlen = msglen + GTS_SOCKET_HEADER;


/* ВЫВЕДИТЕ «ОБРАБОТАННЫЕ» ДАННЫЕ ИЗ БУФЕРА ПУТЕМ ПЕРЕМЕЩЕНИЯ НЕОБРАБОТАННЫХ ДАННЫХ В ЕГО ВЕРХНЮЮ ЧАСТЬ. РАССЧИТАЙТЕ НОВЫЙ ОБЪЕМ ДАННЫХ В БУФЕРЕ. */

*buflen = *buflen - shiftlen;

memcpy (buffer, buffer + shiftlen, *buflen);

}

dopolneniya-k-aktam-istoricheskim-sobrannie-i-izdannie-arheograficheskoyu-komissieyu-1846-t-i-440-s.html
dopolneniya-soyuzniki-1-2-nastavnik-1-5-dari-yastoyu-v-prohode-smotryu-na-dver-s-viveskoj-grimernaya-isnova.html
dopolneniya-v-prognoznij-plan-privatizacii-municipalnogo-imushestva-reshenie-soveta-ot-29-iyunya-2011-g-xi-80-o.html
dopolnitelnaya-chechenskij-gosudarstvennij-universitet.html
dopolnitelnaya-informaciya-demoversiya-rabochej-programmi-po-discipline-zemlevedenie-dlya-specialnosti-012500-geografiya.html
dopolnitelnaya-informaciya-dlya-uchitelej-k-uchebniku-dlya-9-klassa-enjoy-english-9-m-z-biboletovoj.html
  • holiday.bystrickaya.ru/obrazovatelnaya-oblast-obshestvoznanie.html
  • school.bystrickaya.ru/elektricheskie-mashini.html
  • school.bystrickaya.ru/konferencii-budut-prohodit-na-baze-filiala-3-fgu-3-j-cvkg-mo-rf-im-a-a-vishnevskogo-moskva-poperechnij-prosek-d-17-st-metro-sokolniki-avtobus-140-ili-marshrutnoe-taksi-140-do-ostanovki-gospital.html
  • ekzamen.bystrickaya.ru/sozdanie-effektivnih-vnutrivuzovskih-sistem-obespecheniya-kachestva-kak-sposob-integracii-rossijskih-vuzov-v-mezhdunarodnoe-obrazovatelnoe-prostranstvo.html
  • ekzamen.bystrickaya.ru/sekciya-mirovaya-ekonomika-i-mezhdunarodnie-ekonomicheskie-otnosheniya-programma-novokuzneck-2011-celyu-provedeniya.html
  • occupation.bystrickaya.ru/normi-pervichnih-sredstv-pozharotusheniya-dlya-zhilih-domov-gostinic-obshezhitij-zdanij-administrativnih-uchrezhdenij-i-individualnih-garazhej.html
  • znaniya.bystrickaya.ru/pyat-prirodnih-pozharov-zaregistrirovano-v-lesah-dalnego-vostoka-informacionnoe-agentstvo-primamedia-23062011.html
  • knowledge.bystrickaya.ru/ocenka-funkcionirovaniya-i-sovershenstvovanie-gosudarstvennogo-regulirovaniya-malogo-biznesa-v-severnom-regione.html
  • grade.bystrickaya.ru/metodika-analiza-assortimenta-i-strukturi-produkcii-7-4-metodika-analiza-kachestva-proizvedennoj-produkcii-10-metodika-analiza-ritmichnosti-raboti-predpriyatiya-12.html
  • reading.bystrickaya.ru/mariya-iskusnica-otigrav-pyat-setbolov-vo-vtoroj-partii-sharapova-pobedila-agneshku-radvansku-i-vishla-v-chetvertfinal.html
  • znaniya.bystrickaya.ru/razdel-ix-prikaz-po-mou-dod-bcdod-protokol-2-ot-21-11-2007-g.html
  • klass.bystrickaya.ru/assortiment-pushno-mehovih-tovarov-chast-5.html
  • studies.bystrickaya.ru/kriminologicheskoe-issledovanie-nasledstvennosti-prestupnika-chast-4.html
  • prepodavatel.bystrickaya.ru/tolko-poglyadet-odin-raz-kogda-vpervie-v-istorii-zhenshini-poyavilis-v-armii.html
  • testyi.bystrickaya.ru/710-otdel-xvi-nauki-religii-i-filosofii.html
  • shpargalka.bystrickaya.ru/v-chem-sostoit-ekonomicheskaya-problema-nekotorie-elementi-ekonomiki-15.html
  • portfolio.bystrickaya.ru/osobennosti-morfofunkcionalnih-harakteristik-yunoshej-s-visokim-rezhimom-dvigatelnoj-aktivnosti-v-zavisimosti-ot-sportivnoj-specializacii.html
  • knowledge.bystrickaya.ru/ob-utverzhdenii-respublikanskoj-programmi-kompleksnie-meri-protivodejstviya-zloupotrebleniyu-narkotikami-i-ih-nezakonnomu-oborotu-v-respublike-buryatiya-na-2010-2012-godi.html
  • testyi.bystrickaya.ru/avallonpsihologiya-situacij-hrestomatiya.html
  • kontrolnaya.bystrickaya.ru/razdel-1-motivi-1-motivi-12-chast-chto-takoe-psi-13.html
  • occupation.bystrickaya.ru/metodicheskie-ukazaniya-po-vipolneniyu-diplomnogo-proekta-po-specialnosti-260501-tehnologiya-produktov-obshestvennogo-pitaniya-dlya-vseh-form-obucheniya-stranica-5.html
  • urok.bystrickaya.ru/proekt-v-razlichnie-godi-imevshij-razlichnie-nazvaniya-abilaj-han.html
  • thescience.bystrickaya.ru/issledovanie-vozmozhnosti-predskazaniya-budushej-dohodnosti-akcij-na-osnove-analiza-tekushih-finansovih-koefficientov-na-urovne-strani-v-celom-velikobritanii-issleduemaya-gipoteza.html
  • turn.bystrickaya.ru/otchyot-za-2004-2005-uch-g-federalnoj-eksperimentalnoj-ploshadki-mou-srednyaya-obsheobrazovatelnaya-shkola-2-g-tirniauz.html
  • exchangerate.bystrickaya.ru/kosmos-i-chelovek.html
  • laboratornaya.bystrickaya.ru/rabochaya-programma-disciplini-osnovi-tehnologii-pererabotki-prudovih-rib-dlya-specialnosti-271000-tehnologiya-ribi-i-ribnih-produktov.html
  • exchangerate.bystrickaya.ru/inzhenerno-geologicheskie-iziskaniya-dlya-opredeleniya-harakteristik-gruntov-i-osnovanij.html
  • lesson.bystrickaya.ru/metodika-izucheniya-elementov-matematicheskogo-modelirovaniya-v-kurse-matematiki-5-6-klassov-2.html
  • shpargalka.bystrickaya.ru/uchebnoj-disciplini-ekologicheskij-monitoring-rekomenduetsya-dlya-napravleniya.html
  • education.bystrickaya.ru/26-marta-2012g-na-priobretenie-produktov-pitaniya-dlya-nuzhd-mauz-scrb.html
  • uchebnik.bystrickaya.ru/uchetnaya-politika-organizacii-principi-ee-formirovaniya-i-raskritiya.html
  • klass.bystrickaya.ru/58-e-zasedanie-verhovnogo-suda-severnoj-osetii-po-delu-kulaeva-stranica-3.html
  • assessments.bystrickaya.ru/dnevnoe-otdelenie-uchebno-metodicheskij-kompleks-po-discipline-botanika-napravlenie-podgotovki.html
  • reading.bystrickaya.ru/kulturologiya-antropologicheskie-teorii-kultur-www-lekcii-at-ua-stranica-16.html
  • tetrad.bystrickaya.ru/vipusknih-ekzamenov-za-kurs-osnovnoj-obshej-shkoli-v-2011-godu-predsedatel-ekzamenacionnoj-komissii.html
  • © bystrickaya.ru
    Мобильный рефератник - для мобильных людей.