В прошлой статье «Сокеты в C#» мы познакомились с сокетами и подробно рассмотрели классы для работы с ними. В этой статье мы разработаем простое приложение «Сканер портов» на языке C#.
Для начала в Visual Studio создаем Windows Forms проект:
Для начала в Visual Studio создаем Windows Forms проект:
![](https://static.tildacdn.com/tild6363-3730-4563-b165-366238623236/scaner_portov_si_sch.png)
Создаем форму приложения:
![](https://static.tildacdn.com/tild6232-3731-4631-a637-386362653066/scaner_portov_si_sch.png)
На форму добавляем следующие объекты:
- 1 TextBox и меняем в свойствах «Name» на «tIPAddress»;
- 1 NumericUpDown и меняем в свойствах «Name» на «nBeginPort»;
- 1 NumericUpDown и меняем в свойствах «Name» на «nEndPort»;
- 3 объекта Label (IP-адрес, Порты с, по);
- 1 listView и добавляем ему столбцы (Порт, Открыт, Закрыт):
![](https://static.tildacdn.com/tild3038-6662-4461-a536-343131626263/scaner_portov_si_sch.png)
- 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() завершает запрос на соединение и вернет соединенный сокет.
Если вы все сделали правильно, тогда скомпилируйте приложение и проверьте на работоспособность свое приложение. Будут вопросы пишите свои комментарии.
Метод EndConnect() завершает запрос на соединение и вернет соединенный сокет.
Если вы все сделали правильно, тогда скомпилируйте приложение и проверьте на работоспособность свое приложение. Будут вопросы пишите свои комментарии.