|

Delphi
Xakep, номер #042, стр. 042-058-2
Единственный недостаток асинхронности - надо самому проверять результат работы функции connect. Но это не так уж и сложно, и ты убедишься в этом, когда увидишь исходник сканера.
Логика правильного быстрого сканера
Давай теперь на пальцах прикинем, как же будет работать быстрый сканер:
1. Надо объявить кучу переменных типа TSOCKET, а лучше объявить массив таких переменных, например:
FSocket: array [0..39] of TSOCKET; //Массив из 40 сокетов
В этом примере я объявил 40 сокетов, значит можно сканировать сразу по 40 портов.
2. Проинициализировать сетевую библиотеку.
3. Каждому сокету из массива назначить свой номер порта и выполнить функцию connect. Первый сокет будет пытаться присоединиться к 1-му порту, 2-й - ко второму и так далее.
4. Добавить все сокеты в специальный контейнер сетевых событий.
5. Запустить ожидание события.
6. Если произойдет какое-нибудь событие, значит произошел коннект.
7. Вывести информацию об открытых портах и закрыть все сокеты.
8. Можно перейти на первый шаг и запустить скан следующей партии портов.
В этом случае скан происходит пачками по несколько портов сразу без использования каких-либо дополнительных потоков. Это позволяет не только выиграть в скорости, но и сильно разгрузить систему от лишней нагрузки с потоками.
Событийная модель WinSock
Библиотека WinSock тоже может работать через события. Для этого нужно создать объект событие с помощью функции WSACreateEvent(). После этого добавить к нему сокеты, от которых нужно ожидать события с помощью функции WSAEventSelect. Потом нужно дождаться события от любого из указанных сокетов и можно работать дальше, а именно проверять результат коннекта.
С помощью событий очень удобно отслеживать, когда произойдет коннект. Мы же будем работать в асинхронном режиме, поэтому следить придется самостоятельно. Поэтому можно добавить в объект события все наши сокеты, указать, что мы ждем события о соединении с сервером, и просто запустить ожидание.
Если что-то непонятно, то потерпи, когда ты увидишь исходник сканера. На практике это легче воспринимается.
Время и количество
Когда мы запускаем ожидание события, то должны указать максимальное время в секундах. Это необходимо, потому что если сервер не ответит, то программа может ждать очень долго. Это особенно важно для сканера портов, потому что мы будем пытаться присоединиться ко всем портам.
Допустим, что программа проверяет коннект с 21-м портом. А если он у сервера закрыт, то она может долго и нудно ждать ответа, которого просто не будет. Раз порт закрыт, значит и ответа не может быть. Вот именно поэтому обязательно нужно указывать максимальное время ожидания, после которого считается, что соединение невозможно.
Назад на стр. 042-058-1 Содержание Вперед на стр. 042-058-3
|