Информация о сетевых подключениях на C#

Ниже будет продемонстрирован примел того, как можно получить информацию на выбор сетевого подключения, wifi, ethernet, всех сетевых интерфейсов системы.

Информация включает в себя, тип устройства, скорость, объем переданной и полученной информации в текущий момент.

Достаточно выбрать сетевое подключения и в реальном времени вы будите видеть, как изменяются данные на получения и отдачу.

Данный пример пригодится системным администраторам, что позволит производить мониторинг активности.

Получение информации о сетевых интерфейсах

Пример кода, который перечисляет все доступные сетевые интерфейсы и выводит основную информацию о каждом:

using System;
using System.Net.NetworkInformation;
using System.Windows.Forms;

namespace InterfaceTrafficWatch
{
    /// <summary>
    /// Наблюдение за трафиком сетевого интерфейса
    /// </summary>
    public partial class MainForm : Form
    {
        /// <summary>
        /// Обновление таймера (каждые 1 сек)
        /// </summary>
        private const double timerUpdate = 1000;

        /// <summary>
        /// м
        /// </summary>
        private NetworkInterface[] nicArr;

        /// <summary>
        ///Основной объект таймера
        ///(мы могли бы использовать что-то более эффективное, такое как
        /// как вызовы взаимодействия с HighPerformanceTimers)
        /// </summary>
        private Timer timer;

        /// <summary>
        /// Конструктор
        /// </summary>
        public MainForm()
        {
            InitializeComponent();
            InitializeNetworkInterface();
            InitializeTimer();
        }

        /// <summary>
        /// Инициализация всех сетевых интерфейсов на этом компьютере
        /// </summary>
        private void InitializeNetworkInterface()
        {
            //Захват всех локальных интерфейсов на этом компьютере
            nicArr = NetworkInterface.GetAllNetworkInterfaces();

            // Добавление имени каждого интерфейса в поле со списком
            for (int i = 0; i < nicArr.Length; i++)
                cmbInterface.Items.Add(nicArr[i].Name);

            // Изменение начального выбора на первый интерфейс
            cmbInterface.SelectedIndex = 0;
        }

        /// <summary>
        /// Инициализация таймера
        /// </summary>
        private void InitializeTimer()
        {
            timer = new Timer();
            timer.Interval = (int)timerUpdate;
            timer.Tick += new EventHandler(timer_Tick);
            timer.Start();
        }

        /// <summary>
        ///Обновление компонентов графического интерфейса пользователя для сетевых интерфейсов
        /// </summary>
        private void UpdateNetworkInterface()
        {
            //Захват объекта NetworkInterface, описывающего текущий интерфейс
            NetworkInterface nic = nicArr[cmbInterface.SelectedIndex];

            // Захват статистики для этого интерфейса
            IPv4InterfaceStatistics interfaceStats = nic.GetIPv4Statistics();

            //Вычисление скорости ввода и вывода байтов
            //ПРИМЕЧАНИЕ: мы могли бы использовать что - то более быстрое и надежное, чем Windows Forms Tiemr
            //  например, HighPerformanceTimer
            int bytesSentSpeed = (int)(interfaceStats.BytesSent - double.Parse(lblBytesSent.Text)) / 1024;
            int bytesReceivedSpeed = (int)(interfaceStats.BytesReceived - double.Parse(lblBytesReceived.Text)) / 1024;

            // Обновление labels
            lblSpeed.Text = nic.Speed.ToString();
            lblInterfaceType.Text = nic.NetworkInterfaceType.ToString();
            lblSpeed.Text = nic.Speed.ToString();
            lblBytesReceived.Text = interfaceStats.BytesReceived.ToString();
            lblBytesSent.Text = interfaceStats.BytesSent.ToString();
            lblUpload.Text = bytesSentSpeed.ToString() + " KB/s";
            lblDownload.Text = bytesReceivedSpeed.ToString() + " KB/s";

        }

        /// <summary>
        /// Событие Timer для каждого тика (секунды) для обновления пользовательского интерфейса
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void timer_Tick(object sender, EventArgs e)
        {
            UpdateNetworkInterface();
        }

    }
}

Что можно получить дополнительно:

  • IP-адреса через ni.GetIPProperties();
  • MAC-адрес через ni.GetPhysicalAddress();
  • Тип подключения (Ethernet, Wi-Fi и др.);
  • Состояние интерфейса (включён/отключён).

Применение

  • Диагностика проблем с сетью;
  • Информация для админ-панелей и системных утилит;
  • Проверка подключения в корпоративных приложениях;
  • Отображение в UI текущего статуса сети.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.