.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 (оно сработает при окончании работы). |