Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Верхотуров ПЗ 1.docx
Скачиваний:
67
Добавлен:
25.04.2017
Размер:
1.42 Mб
Скачать
      1. Сбор информации о сети при помощи самостоятельно написанной программы

Сбор информации о сети можно разделить на 2 главные задачи: ввод диапазона адресов и определение работоспособности узла и его доменного имени

        1. Ввод и генерация диапазона адресов

Для упрощения процесса сбора информации о сети, необходимо предусмотреть возможность ввода нескольких адресов или диапазона, путем ввода начального и конечного адреса. В случае ввода диапазона значений, то необходимо сгенерировать все адреса от начального до конечного или возможность получения «следующего» адреса.

Обобщенный алгоритм генерации диапазона адресов

  1. Считать значения первого адреса диапазона, преобразовать их в ip-адрес

  2. Считать значения последнего адреса диапазона, преобразовать их в ip-адрес

  3. Проверить что первый адрес диапазона меньше последнего

  4. Инкрементировать первый адрес до тех пор, пока он не станет равным последнему

        1. Определение работоспособности узла и его доменного имени

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

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

  • Асинхронная модель построена на очереди событий. При возникновении некоторого события (пришел запрос, выполнилось считывание файла, пришел ответ от БД и т.д.) оно помещается в конец очереди. Поток, который обрабатывает эту очередь, берет событие с начала очереди, и выполняет связанный с этим событием код. Пока очередь не пуста процессор будет занят работой. Таким образом, запустив некоторый запрос, основной поток приложения приступит к запуску следующего, не ожидая ответа на предыдущий запрос. Ответ на предыдущий запрос будет обработан в порядке очереди. Отправка асинхронного запроса предполагает написание метода Callback, который осуществит обработку ответа на запрос непосредственно после завершения запроса.Callbackметод называют методом обратного вызова. В его теле доступны результаты завершенного асинхронного запроса.

  • Многопоточность - свойство платформы (например, операционной системы, виртуальной машины и т. д.) или приложения, состоящее в том, что процесс, порождённый в операционной системе, может состоять из нескольких потоков, выполняющихся «параллельно», то есть без предписанного порядка во времени. При создании (не запуске!) потока, ему передается делегат (функция или объект), который содержит в себе необходимую для выполнения функциональность. Запустить поток можно в любой момент после создания. Базовыми для большинства языков являются следующие методы: .start() – запустить поток, .wait() – дождаться окончания выполнения потока, .interrupt\.abort() – остановить выполнение потока.

Рассмотрим сами методы анализа:

  • Вызов системных консольных утилит ping,nslookupиз приложений на языкеJava,Python,C# и т.д. Данный метод достаточно сложен в реализации, т.к. потребует анализ выходного потока консоли, подписку на события и обработку ошибок, а также не гарантирует работу на операционных системах, отличных от предусмотренных.

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

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

  • В .NETмногопоточность реализуется при помощиThread. Платформа .NETпредставляет 3 паттерна для выполнения асинхронных операций:APM(.NET1.0),EAP(.NET2.0),TAP(.NET4.0).APM-паттерн(Asynchronous Programming ModelPattern) требует методовBeginиEnd, напримерBeginWriteиEndWrite.EAP-паттерн(Event-based Asynchronous Pattern) требует наличие метода с суффиксомAsync, а также один или несколько событий-делегатов, унаследованных отEventArgs.TAP-паттерн использует один метод для инициализации и завершения асинхронной операции. Используется с ключевыми словамиasync,await.APM,EAPпаттерны являются устаревшими и не рекомендуются к использованию. Анализ узла можно произвести средставми языка.

  • Pythonимеет аналогичные инструменты и возможности:Threadотвечает за многопоточность, операторыasync\awaitпозволяют писать асинхронные функции, а встроенные библиотеки предоставляют возможность анализа узла.

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

Обобщённый алгоритм сбора информации о сети

  1. Для каждого адреса из диапазона:

    1. Запросить статус работоспобности узла:

      1. Создать асинхронный запрос работоспобности узла.

      2. Прикрепить Callbackметод к запросу.

      3. Отправить асинхронный запрос работоспобности узла.

    2. В методе Callback:

      1. Извлечь информацию о результате запроса

      2. Сохранить результат.

  2. Для каждого адреса из диапазона:

    1. Определить доменное имя узла:

      1. Создать новый поток, указав на метод делегат.

      2. Запустить поток.

    2. В методе делегате:

      1. Выполнить запрос на разрешение IP-адреса в доменное имя.

      2. Сохранить результат.