IP инструмент сканирования может оказаться полезным, если вы хотите проверить безопасность вашего компьютера. Открытый порт это не обязательно приглашение для хакеров, так как приложения и сервисы вашего или другого компьютера могут использовать порты для выхода в Интернет или локальную сеть. Например, для веб-сервера по умолчанию открыт 80-й порт, или на FTP-сервере - 21-й порт. Рассмотрим класс TcpClient, расположенный в пространстве имен «System.Net.Sockets» и обеспечивает простые методы для подключения, а также отправки и получения потоков данных в сети. Рассмотрим проверку открытых портов удаленного сетевого устройства.
Создайте проект Windows Form в Microsoft Visual Studio и добавьте на главную форму следующие элементы управления:
Выберете элемент управления «numericUpDown1» и перейдите в его свойства. Найдите свойство «Maximum», выставляющее максимальное значение, которое можно выбрать в данном элементе управления и выставьте значение 25.
Выполните такую же операцию с компонентом «numericUpDown2» и дополнительно выставьте в свойстве «Value», значение 25. Данный параметр установит это значение по умолчанию.Сделайте двойной клик по компоненту «backgroundWorker1», вы перейдете в автоматически созданный метод «backgroundWorker1_DoWork», события «DoWork». Это событие возникает при вызове метода «RunWorkerAsync» и код размещенный в данном методе выполняется в отдельном потоке, что позволяет предотвратить зависание приложения, при долгом выполнении каких либо действий. Добавьте приведенный ниже код в тело данного метода.
Обработчик событий «DoWork» не позволяет выполнять действия ни с какими объектами пользовательского интерфейса. Для обхода данного ограничения в коде присутствует вызов методов «selectedIndex», «PortOpen», «PortClose». Данные методы выполняют указанный делегат асинхронно в потоке, в котором был создан базовый дескриптор элемента управления. Добавьте в листинг главной формы код объявления данных методов.
В окне свойств, перейдите в события данного компонента, нажав в верхней части на значок «молнии». Найдите и сделайте двойной клик левой клавишей мыши по событию «RunWorkerCompleted». Вы перейдете в автоматически созданный метод «backgroundWorker1_RunWorkerCompleted». Добавьте в него приведенный ниже код.
Создайте проект Windows Form в Microsoft Visual Studio и добавьте на главную форму следующие элементы управления:
- backgroundWorker1 – служит для запуска процесса проверки открытых портов сетевого устройства в другом потоке;
- textBox1 – текстовое поле для ввода сетевого адреса устройства;
- numericUpDown1 – элемент управления для ввода стартового номера порта;
- numericUpDown2 – элемент управления для ввода конечного номера порта;
- listBox1 – элемент управления для вывода открытых/закрытых портов;
- button1 – кнопка запуска процесса получения открытых/закрытых портов, заданного диапазона.
Выберете элемент управления «numericUpDown1» и перейдите в его свойства. Найдите свойство «Maximum», выставляющее максимальное значение, которое можно выбрать в данном элементе управления и выставьте значение 25.
Выполните такую же операцию с компонентом «numericUpDown2» и дополнительно выставьте в свойстве «Value», значение 25. Данный параметр установит это значение по умолчанию.Сделайте двойной клик по компоненту «backgroundWorker1», вы перейдете в автоматически созданный метод «backgroundWorker1_DoWork», события «DoWork». Это событие возникает при вызове метода «RunWorkerAsync» и код размещенный в данном методе выполняется в отдельном потоке, что позволяет предотвратить зависание приложения, при долгом выполнении каких либо действий. Добавьте приведенный ниже код в тело данного метода.
// Заносим в переменную StartPort стартовый номер порта из компонента NumericUpDown int StartPort = Convert.ToInt32(numericUpDown1.Value); // Заносим в переменную EndPort конечный номер порта из компонента int EndPort = Convert.ToInt32(numericUpDown2.Value); for (int CurrPort = StartPort; CurrPort <= EndPort; CurrPort++) { //Инициализируем новый экземпляр класса System.Net.Sockets.TcpClient TcpScan = new System.Net.Sockets.TcpClient(); try { //Выполняем подключение клиента к указанному порту заданного узла. TcpScan.Connect(textBox1.Text, CurrPort); //Если подключение выполнено успешно то выводим в listBox1 PortOpen(CurrPort); } catch { //Если возникло исключение то порт закрыт PortClose(CurrPort); } //Переводим курсор на последнюю строку списка selectedIndex(); }В данном коде используется цикл «for», где в качестве условия, устанавливается начальное значение переменной i равное номеру порта, указанного в элементе управления «numericUpDown1», а в качестве условия окончания цикла, выставляется значение, указанное в элементе управления «numericUpDown2». Данный цикл выполняется с шагом, равному единице. В теле данного цикла создается новый экземпляр класса «System.Net.Sockets.TcpClient» и выполняется вызов метода «Connect». Данный метод подключает клиента к удаленному TCP-узлу, указанному в элементу управления «textBox1» и номеру порта который каждый раз увеличивается в условии цикла. Если код вызывает исключение, это вероятно, потому что подключение было неудачным. Однако если нет никаких исключений, это означает, что TcpClient успешно подключен к порту и, таким образом, порт открыт.
Обработчик событий «DoWork» не позволяет выполнять действия ни с какими объектами пользовательского интерфейса. Для обхода данного ограничения в коде присутствует вызов методов «selectedIndex», «PortOpen», «PortClose». Данные методы выполняют указанный делегат асинхронно в потоке, в котором был создан базовый дескриптор элемента управления. Добавьте в листинг главной формы код объявления данных методов.
public void selectedIndex() { try { if (InvokeRequired) BeginInvoke(new MethodInvoker(delegate { listBox1.SelectedIndex = listBox1.Items.Count - 1; })); else { listBox1.SelectedIndex = listBox1.Items.Count - 1; } } catch (Exception) { } } public void PortOpen(int port) { try { if (InvokeRequired) BeginInvoke(new MethodInvoker(delegate { listBox1.Items.Add("Порт " + port + " открыт"); })); else { listBox1.Items.Add("Порт " + port + " открыт"); } } catch (Exception) { } } public void PortClose(int port) { try { if (InvokeRequired) BeginInvoke(new MethodInvoker(delegate { listBox1.Items.Add("Порт " + port + " закрыт"); })); else { listBox1.Items.Add("Порт " + port + " закрыт"); } } catch (Exception) { } }Перейдите в конструктор главной формы, выполнив сочетание клавиш «Shift+F7». Найдите добавленный компонент «backgroundWorker1», сделайте по нему клик правой клавишей мыши и выберете из появившегося контекстного меню, пункт «Свойства».
В окне свойств, перейдите в события данного компонента, нажав в верхней части на значок «молнии». Найдите и сделайте двойной клик левой клавишей мыши по событию «RunWorkerCompleted». Вы перейдете в автоматически созданный метод «backgroundWorker1_RunWorkerCompleted». Добавьте в него приведенный ниже код.
//Разблокируем кнопку по завершению процесса button1.Enabled = true;Для запуска процесса проверки открытых портов необходимо перейти в конструктор главной формы, выполнив сочетание клавиш «Shift+F7» и сделать двойной клик левой клавишей мыши по компоненту «button1». Вы перейдете в автоматически созданный метод «button1_Click» события компонента «Click». Добавьте приведенный ниже код в тело данного метода.
//Очищаем список перед выводом данных listBox1.Items.Clear(); //Блокируем кнопку, для предотвращения повторного запуска //процесса, при уже запущенном процессе button1.Enabled = false; backgroundWorker1.RunWorkerAsync();Запустите ваш проект, нажав на клавиатуре, клавишу «F5». Введите адрес сетевого устройства и выставьте значения начального и конечного портов, которые программа будет проверять. Нажмите кнопку «Старт», по мере сканирования программа будет построчно выводить в компонент «listbox1» данные об открытых или закрытых портах.
Ссылка для скачивания примера: Rusfolder.net
Приложите исходники, т.к. при сборке на многое ругается, чтобы посмотреть
ОтветитьУдалитьи комментарии тогда не обязательно удалять можно ответить на e-mail, он у Вас прописан nik_user@mail.ru
ОтветитьУдалитьОтпишите какие ошибки у вас возникают при построении проекта!
ОтветитьУдалитьПо вашей просьбе в пост был добавлен исходник!
ОтветитьУдалить