Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #53, АПРЕЛЬ 2005 г.

.NET конкурентам!

Скрыпников Сергей

Спецвыпуск: Хакер, номер #053, стр. 053-076-5


Imports System.Net

Imports System.Net.Sockets

IP хоста получаем с помощью метода GetHostByName класса DNS.

Dim IP As Int64 = Dns.GetHostByName(Host).AddressList(0).Address

Далее для каждого порта, который нужно сканировать, создаем Socket и пытаемся соединиться. Если попытка соединения не удастся, будет сгенерировано исключение (Exception), которое мы проигнорируем вписав вызов Connect в конструкцию Try...Catch с пустым блоком Catch.

Dim socket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

Try

socket.Connect(New IPEndPoint(IP, i))

Catch

End Try

После этого узнаем, удалось ли socket’у соединиться (свойство - IsConnected), и передадим эту информацию "куда следует" :), после чего закроем socket:

RaiseEvent Log(i, socket.Connected)

socket.Close()

ClsWorker взаимодействует со своим хозяином (классом frmMain) с помощью механизма событий. В clsWorker описано событие Public Event Log(ByVal Port As Int32, ByVal Opened As Boolean), которое вызывается из кода clsWorker в процессе работы. Так как сканер у нас многопоточный (а как же - фирма веников не вяжет ;), в программе используется класс System.Threading.Thread. Создаем экземпляр класса Thread, в конструкторе которого указываем делегат на процедуру, которая будет запущена в этом потоке (делегат - грубо говоря, ссылка на процедуру, которую можно передавать куда угодно, если пожелаешь, даже средствами .Net Remoting в другой процесс или на другой компьютер и через которую эту процедуру можно легко и просто вызвать). Теперь настраиваем нужные свойства объекта и, наконец, для запуска потока вызываем метод Start. Чтобы прервать выполнение потока, нужно вызвать метод Abort. Приостановить поток - метод Suspend. А для ожидания завершения потока используется метод Join (тот поток, который вызвал этот метод, останется приостановленным до тех пор, пока Thread не станет завершенным).

Теперь пришло время написать код формы frmMain. В первую очередь нужно объявить несколько переменных уровня класса: массив PortsList, в который будут записываться состояния портов, и переменная PortsScanned – счетчик проверенных портов.

Private PortsList(65535) As Boolean

Private PortsScanned As Int32

В обработчике события клика кнопки (btnStart.Click) пишем код запуска проверки портов. Заметим, что мы писали программу с учетом того, что в поле "Кол-во потоков" будут вводиться степени числа 2 (1, 2, 4, 8 и т.д.). Переделать код с учетом "некруглого" числа потоков мы тебе предлагаем самостоятельно, а заодно и проверку на корректность заполнения поля.

Итак, получаем введенное пользователем число потоков: Dim ThreadsCount As Int32 = CInt(txtThreadsCount.Text). Для учета потоков сделан класс ThreadsManager, который ждет завершения "рабочих" потоков и сигнализирует пользователю о завершении работы. Его мы рассмотрим далее. Создаем менеджера потоков и подписываемся на его событие Done (оно сработает при окончании работы).

Назад на стр. 053-076-4  Содержание  Вперед на стр. 053-076-6