Комментарии 4
sem := make(chanstruct{}, maxConcurrency)
За ограничение параллельности отдельный плюс. Часто в таких утилитах всё запускают без особых ограничений, создают кучу горутин, сначала кажется, что так быстрее, а потом начинаются таймауты и лишняя нагрузка на систему и сеть. Тут подход аккуратнее что параллельность есть, но она под контролем. Для сетевого сканера это важная деталь, потому что скорость сама по себе не решает, если утилита начинает душить сеть или саму машину.
for _, ip := range ips {
for _, port := range ports {
wg.Add(1)
go func(target string, ip string, port int) {Этот код может создавать огромное количество горутин (количество целевых адресов * количество целевых портов), которые просто занимают память, ожидая своего часа. Исправляется это воркерами, которые заспавнены в нужном количестве, а также очередью к ним.
Но лучше не заниматься этой порнографией и использовать готовые сканеры, самый известный из которых — nmap.
Но лучше не заниматься этой порнографией и использовать готовые сканеры, самый известный из которых — nmap.
Да, есть готовые опенсорсные решения nmap, masscan (с которыми знаком почти каждый системный администратор) и другие.
Прежде чем разрабатывать новую программу необходимо ответить на вопрос, чем не подходят уже существующие ПО. Сейчас это выглядит как проект ради проекта, статья ради статьи.
Можно было использовать worker-pool, на счет готовых сканеров, мне просто было интересно самому что-то такое реализовать

Пишем TCP-сканер портов на Go: goroutine, timeout и CSV-отчёт