В прошлой статье “Сокеты в 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() завершает запрос на соединение и вернет соединенный сокет.
Если вы все сделали правильно, тогда скомпилируйте приложение и проверьте на работоспособность свое приложение. Будут вопросы пишите свои комментарии.
12 ответов к “Создание сканера портов”
Извините, а как правильно пользоваться этой программой? Просто пишу любые порты и все они открыты.
не должно быть так. Значит неправильно сделали.
Доброго времени. А как сделать, что бы сканирование происходило о списку ip? Например: 192.0.0.1-192.255.255.255
Сделать цикл по IP.
можете помочь?
Лично не помогаю. Только статьи и видео делаю и все.
1 ProgressBar; куда ставлять???
немогу понять
System.Net.Sockets.SocketException: “Требуемый адрес для своего контекста неверен”
такая ошибка выходит, что это значит?
помогите
можете помочь с блок схемой этого кода?
помогите пж
Бурхонжон Юсупов, вы смогли составить блок схему? помогите пожалуйста
Вы смогли сделать блок схему? скиньте пожалуйста на kamiliaamantaeva779@gmail.com
Что вы подразумеваете под блок-схемой? Что бы сделать ее, надо чтоб в приложении было несколько классов и чтоб они тем или иным способом были связаны между собой. А тут это отсутствует! Или что-то другое подразумевается?