Реализовать сканер портов в Go и объяснить шаблон конвейера.

Сканер портов предназначен для проверки сервера или хоста на наличие открытых портов. В этой серии статей мы реализуем сканер портов в Go и тем временем объясним некоторые концепции параллелизма.

Мы рассмотрим шаблон конвейера во второй части статьи Ограничение свободного параллелизма. Если вы пропустили часть 1, прочтите ее, чтобы получить основную информацию.



Что такое трубопровод?

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

  • получать значения от upstream по входящим каналам
  • выполнять некоторую функцию над этими данными, обычно создавая новые значения
  • отправлять значения вниз по исходящим каналам

Блок-схема конвейера

На изображении выше показан весь конвейер сканера портов. Давайте объясним каждую связанную функцию одну за другой в следующем разделе.

  • Функция инициализации
  • Функция parsePortsToScan
  • структура scanOp
  • Генератор функций
  • Функциональное сканирование
  • Функциональный фильтр
  • Функциональный магазин
  • Основная функция

Главный компонент

  • Инициализация функции

Функция init определяет аргументы, передаваемые пользователем.

Переменная ports представляет собой строку портов для сканирования, разделенную дефисом. Переменная outFile — это файл для записи результатов.

Функция parsePortsToScan

Функция parsePortsToScan анализирует порты для сканирования из аргумента командной строки. Если аргумент недействителен, возвращается ошибка. Если аргумент действителен, возвращается часть ints.

Сканирование структуры

scanOp представляет операцию сканирования одного порта и ее результаты (open, scanErr, scanDuration). open — логическое значение, указывающее, открыт ли порт. scanErr — это сообщение об ошибке в случае сбоя сканирования. scanDuration — это время, затраченное на выполнение сканирования.

Для вывода результатов в CSV-файл программа записи CSV использует два метода. csvHeaders возвращает заголовки в срезе строк. asSlice возвращает поля значений scanOp в виде фрагмента строк.

Генератор функций

Функция gen — это функция-генератор, которая возвращает буферизованный канал из scanOps значений структуры из среза портов типа int. Он используется для создания конвейера функций, которые будут выполняться последовательно, и это первая функция в конвейере.

Сканирование функций

Функция scan отвечает за фактическое сканирование портов. Он принимает буферизованный канал scanOps и возвращает небуферизованный канал scanOps.

Фильтр функций

Функция filter отвечает за фильтрацию открытых операций сканирования.

Развлекательный магазин

Функция store отвечает за сохранение scanOps в файле CSV. Это последняя функция в конвейере.

Главная функция

Основная функция отвечает за выполнение конвейера функций. Он принимает срез портов int и строку outfile из аргументов командной строки.

Затем он начинает организовывать конвейер функций, начиная с функции gen и заканчивая функцией store.

Наконец, он выводит результаты на консоль.

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

Заключение

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

Нашли эту статью полезной 👏? Ознакомьтесь с другими моими статьями ниже!

  1. Как работает канал Golang
  2. Принципы SOLID в Голанге с примерами
  3. Шаблон проектирования Observer в Golang с примером