Программа сканирования портов

83

В предыдущей статье было рассмотрено самое простое приложение клиент-сервер, теперь с помощью исключения 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;
        }
    }
}
Прослушка TCP-портов
Пройди тесты
Лучший чат для C# программистов