Программа сканирования портов
83C# и .NET --- Сетевое программирование --- Программа сканирования портов
В предыдущей статье было рассмотрено самое простое приложение клиент-сервер, теперь с помощью исключения SocketException создадим нечто более интересное.
В следующем примере создадим собственную программу сканирования портов, которая пытается соединиться с localhost по каждому порту, указанному в цикле. Сообщаем об успешных соединениях, а если установить соединение не удается, перехватываем порождаемое в этом случае исключение SocketException. В качестве графической среды используется WPF.
Сканер портов может использоваться для получения списка открытых портов на вашем компьютере. В открытых портах проявляется потенциальная слабость системы, которой могут воспользоваться приложения-нарушители. Вот полный код программы, включая исходную XAML-разметку:
<Window x:Class="SocketPortScaner.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Сканер портов" WindowState="Maximized">
<ListView Name="listview_scaner" Margin="5">
<ListView.Resources>
<Style TargetType="{x:Type ListView}">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
</Setter.Value>
</Setter>
</Style>
</ListView.Resources>
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="Port ID" DisplayMemberBinding="{Binding Path=PortNumber}"
Width="150"/>
<GridViewColumn Header="Local Adress" DisplayMemberBinding="{Binding Path=Local}"
Width="250"/>
<GridViewColumn Header="Remote Adress" DisplayMemberBinding="{Binding Path=Remote}" Width="250"/>
<GridViewColumn Header="State" DisplayMemberBinding="{Binding Path=State}" Width="250"/>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Data;
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
namespace SocketPortScaner
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
List<PortInfo> pi = MainWindow.GetOpenPort();
listview_scaner.ItemsSource = pi;
}
private static List<PortInfo> GetOpenPort()
{
IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] tcpEndPoints = properties.GetActiveTcpListeners();
TcpConnectionInformation[] tcpConnections = properties.GetActiveTcpConnections();
return tcpConnections.Select(p =>
{
return new PortInfo(
i: p.LocalEndPoint.Port,
local: String.Format("{0}:{1}", p.LocalEndPoint.Address, p.LocalEndPoint.Port),
remote: String.Format("{0}:{1}", p.RemoteEndPoint.Address, p.RemoteEndPoint.Port),
state: p.State.ToString());
}).ToList();
}
}
class PortInfo
{
public int PortNumber { get; set; }
public string Local { get; set; }
public string Remote { get; set; }
public string State { get; set; }
public PortInfo(int i, string local, string remote, string state)
{
PortNumber = i;
Local = local;
Remote = remote;
State = state;
}
}
}