Delphi

Xakep, номер #042, стр. 042-058-1

Самый быстрый сканер портов

Horrific aka Фленов Михаил smirnandr@mail.ru www.cydsoft.com/vr-online

В прошлом номере Х мы уже познакомились с основными функциями winsock. Мы уже знаем, как и что нужно инициализировать и как произвести коннект. Если ты помнишь принцип работы сканера портов, то должен уже понять, что этого вполне достаточно. Дополнительные функции мы изучим в процессе написания самого быстрого в мире сканера.

Предисловие

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

Такая секретность достаточно очевидна, ведь если снять тайну с алгоритма, то они не смогут заколачивать деньги. Зайди на download.com и посмотри, сколько денег просят за быстрый скан. Любой познавший эту тайну сразу пишет свою прогу, пичкает какими-нибудь никому не нужными дополнительными возможностями и продает по 10-15 у.е. за прогу. Вроде не так уж много, но небольшой капитальчик забабахать можно.

Мы не жадные и поэтому решили поделиться этим алгоритмом. Если ты сможешь красиво оформить наш сканер портов, то сможешь перейти на легал и начать зарабатывать доллары для нашей страны вполне нормальным кодингом. Почему Индия может содержать свой бюджет благодаря программистам, а мы его содержим благодаря нефтяникам?

Ну а если ты в свой сканер добавишь такие возможности, как Ping, Whois (я уже описывал это в Х) или еще чего из сетевых примочек, то у твоей программы будет намного больше шансов заработать побольше денег.

Неправильный быстрый скан

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

Если работать с сетью в синхронном режиме, то получаются большие накладные расходы на ожидание коннекта и для реального увеличения скорости нужно запускать 30-40 потоков. Это очень неудобно и усложняет программу, а значит, она будет нестабильной и неудобной.

А вот как надо

Для нормального скана не надо никаких дополнительных потоков. Тут нужно воспользоваться возможностями асинхронности сетевых функций. Это, на первый взгляд, сложнее в кодинге, но реально такой сканер будет содержать намного меньше кода (максимум 40 строчек), а главное - реальный выигрыш в скорости и реальная параллельность скана.

Итак, если ты читал статью "Сетевая библиотека Winsock" в прошлом номере Х, то уже должен знать, что такое асинхронность. Я только напомню, что при синхронном режиме ОС останавливается на каждой функции и ожидает ее окончательного исполнения. При асинхронном режиме функция выполняется, но нет ожидания ответа от сервера.

Рассмотрим реальный пример асинхронности. Для нашего сканера нужна только одна функция - connect. Когда мы вызываем ее в асинхронном режиме, то ОС посылает запрос на соединение к серверу и, не дожидаясь реального коннекта, продолжает работать дальше, как ни в чем не бывало. Вот как раз тут и поковырялась собака точка ру :). Мы можем послать запрос на соединение в асинхронном режиме, а пока сервер решает, какой прислать ответ, можно послать еще кучу запросов на соединение. Потом нужно только подождать немного, чтобы сервер успел обработать все твои запросы, и потом проверить результат.

Содержание  Вперед на стр. 042-058-2

ttfb: 430.70888519287 ms