Языки программирования

Создание сканера портов

В прошлой статье «Сокеты в C#» мы познакомились с сокетами и подробно рассмотрели классы для работы с ними. В этой статье мы разработаем простое приложение «Сканер портов» на языке C#.

Для начала в Visual Studio создаем Windows Forms проект:
Создаем форму приложения:
На форму добавляем следующие объекты:

  • 1 TextBox и меняем в свойствах «Name» на «tIPAddress»;
  • 1 NumericUpDown и меняем в свойствах «Name» на «nBeginPort»;
  • 1 NumericUpDown и меняем в свойствах «Name» на «nEndPort»;
  • 3 объекта Label (IP-адрес, Порты с, по);
  • 1 listView и добавляем ему столбцы (Порт, Открыт, Закрыт):
  • 1 ProgressBar;
  • 1 Button (Сканировать).

После создания формы приложения нажимаем два раза на кнопку «Сканировать» и пишем код приложения:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Net.NetworkInformation;

namespace skaner_port
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        public static ManualResetEvent connectDone = new ManualResetEvent(false);

        private static void ConnectCallback(IAsyncResult ar)
        {
            try
            {
                Socket client = (Socket)ar.AsyncState;
                client.EndConnect(ar);
                connectDone.Set();
            }
            catch (Exception e)
            {

            }
        }

        public void button1_Click(object sender, EventArgs e)
        {
            int BeginPort = Convert.ToInt32(nBeginPort.Value);
            int EndPort = Convert.ToInt32(nEndPort.Value);

            int i;

            progressBar1.Maximum = EndPort - BeginPort + 1;

            progressBar1.Value = 0;
            listView1.Items.Clear();

            IPAddress addr = IPAddress.Parse(tIPAddress.Text);

            for (i = BeginPort; i <= EndPort; i++)
            {
                // Создаем и инициализируем сокет
                IPEndPoint ep = new IPEndPoint(addr, i);
                Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                // Пытаемся соединиться с сервером
                IAsyncResult asyncResult = soc.BeginConnect(ep, new AsyncCallback(ConnectCallback), soc);

                if (!asyncResult.AsyncWaitHandle.WaitOne(30, false))
                {
                    soc.Close();
                    listView1.Items.Add("Порт " + i.ToString());
                    listView1.Items[i - BeginPort].SubItems.Add("");
                    listView1.Items[i - BeginPort].SubItems.Add("закрыт");
                    listView1.Items[i - BeginPort].BackColor = Color.Bisque;
                    listView1.Refresh();
                    progressBar1.Value += 1;
                }
                else
                {
                    soc.Close();
                    listView1.Items.Add("Порт " + i.ToString());
                    listView1.Items[i - BeginPort].SubItems.Add("открыт");
                    listView1.Items[i - BeginPort].BackColor = Color.LightGreen;
                    progressBar1.Value += 1;
                }
            }
            progressBar1.Value = 0;
        }
    }
}
Метод BeginConnect() асинхронно пытается подключиться к удаленному хосту. Ему нужно передать метод обратного вызова, который должен вызвать метод EndConnect().

Метод EndConnect() завершает запрос на соединение и вернет соединенный сокет.

Если вы все сделали правильно, тогда скомпилируйте приложение и проверьте на работоспособность свое приложение. Будут вопросы пишите свои комментарии.
Самоучитель по C#