Справочник по C#

    Исходники по языку программирования CSharp

    Создание сканера портов: Справочник по C#

    /
    /
    /
    264 Views


          IP инструмент сканирования может оказаться полезным, если вы хотите проверить безопасность вашего компьютера. Открытый порт это не обязательно приглашение для хакеров, так как приложения и сервисы вашего или другого компьютера могут использовать порты для выхода в Интернет или локальную сеть. Например, для веб-сервера по умолчанию открыт 80-й порт, или на FTP-сервере – 21-й порт. Рассмотрим класс TcpClient, расположенный в пространстве имен «System.Net.Sockets» и обеспечивает простые методы для подключения, а также отправки и получения потоков данных в сети. Рассмотрим проверку открытых портов удаленного сетевого устройства.
          Создайте проект 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

    Создание сканера портов: Справочник по C#

    0.00 (0%) 0 votes

    moyadcode13
    • Facebook
    • Twitter
    • Google+
    • Linkedin
    • Pinterest
    moyadcode10
    moyadcode11
    moyadcode9