Домой C# Трафик сетевых интерфейсов локального компьютера: Справочник по C#

Трафик сетевых интерфейсов локального компьютера: Справочник по C#

589
0


      В данной инструкции рассматривается получение списка доступных сетевых интерфейсов компьютера и получение по каждому из них информации, такой как описание интерфейса, идентификатор, скорость сетевого интерфейса, число полученных/отправленных байт и др. Для реализации данной задачи используется класс «NetworkInterface», предоставляющего конфигурацию и статистику сетевого интерфейса.
      Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте приведенный ниже список элементов управления:

  • comboBox1 – представляет элемент управления поле со списком, содержащее список доступных сетевых интерфейсов;
  • textBox1 – текстовое поле для вывода имени сетевого интерфейса;
  • textBox2 – текстовое поле для вывода идентификатора сетевого интерфейса;
  • textBox3 – текстовое поле для вывода IP адреса сетевого интерфейса;
  • textBox4 – текстовое поле для вывода МАС-адреса (физический адрес);
  • textBox5 – текстовое поле для вывода типа сетевого интерфейса;
  • textBox6 – текстовое поле для вывода адресов DNS серверов;
  • textBox7 – текстовое поле для вывода DNS суффикса;
  • textBox8 – текстовое поле для вывода адресов сетевых шлюзов;
  • textBox9 – текстовое поле для вывода значения «true», если на этом интерфейсе настроен «NetBIOS» через TCP/IP, для использования разрешения DNS-имен; в противном случае — false;
  • textBox10 – текстовое поле для вывода адресов WINS-серверов;
  • textBox11 – текстовое поле для вывода скорости сетевого интерфейса;
  • textBox12 – текстовое поле для вывода количества килобайт полученных интерфейсом;
  • textBox13 – текстовое поле для вывода количества килобайт отправленных интерфейсом;
  • timer1 – таймер реализующий вызов метода получения информации, через определенный интервал времени;
  • backgroundWorker1 — элемент управления, выполняющий операцию в отдельном потоке.

У вас получится приведенный ниже вариант.

      Для получения списка сетевых интерфейсов локального компьютера используется метод «GetAllNetworkInterfaces», класса «NetworkInterface». Данный класс представляет собой массив, который содержит объекты, описывающий доступные сетевые интерфейсы, или пустой массив, если интерфейсы не обнаружены.

Дополнительную информацию по классу «NetworkInterface», вы можете получить с сайта Microsoft MSDN.

      Сделайте двойной клик по свободному пространству главной формы. Вы перейдете в автоматически созданный метод «Form1_Load», события «Load» главной формы, возникающего при ее загрузке. Добавьте в данный метод приведенный ниже листинг.

//Перебираем все сетевые интерфейсы и
//заносим их имена в comboBox1,
adapters =
System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
foreach (System.Net.NetworkInformation.NetworkInterface adapter in adapters)
{
//добавляем в компонент comboBox1 имена
//всех найденных сетевых интерфейсов
comboBox1.Items.Add(adapter.Name);
}

//Выбираем первый элемент из выпадающего списка
comboBox1.SelectedIndex = 0;

//Запуск таймера при загрузке главной формы
timer1.Enabled = true;

      Объявите переменную «adapters», класса «NetworkInterface», представляющею конфигурацию и статистику сетевого интерфейса.

System.Net.NetworkInformation.NetworkInterface[] adapters;

      Так как весь код главной формы выполняется в одном потоке, то постоянное получение данных о сетевом интерфейсе приведет к ее зависанию. Для устранения данной проблемы необходимо запустить процесс в фоновом режиме или организовать многопоточность.
      Для организации многопоточности в Microsoft Visual Studio используется элемент управления «BackgroundWorker». BackgroundWorker — (System.ComponentModel.BackgroundWorker) класс или элемент управления, предназначенный для создания и управления работой потоков. Он предоставляет следующие возможности:

  • Возможность прерывания потока; 
  • Возможность обработки исключений в фоновом потоке; 
  • Стандартизированный протокол создания, сигнализации о ходе выполнения и завершения потока; 
  • Возможность связи с основным потоком через сигнализацию о ходе выполнения и окончания; 
  • Возможность использования как элемента управления в Visual Studio Net. 

BackgroundWorker предоставляет следующие основные методы:

  • CancelAsync — можно использовать для досрочного завершения фоновой операции. CancelAsync устанавливает соответствующее значение свойства CancellationPending. Фоновый код, поддерживающий досрочное завершение, проверяет значение этого свойства и, как только оно становится равным True, завершает свое выполнение. 
  • DoWork — вызывается при старте потока. В методе можно определить код, который будет выполняться в отдельном потоке. 
  • ProgressChanged — может быть использован для отслеживания прогресса выполнения фонового потока. 
  • RunWorkerAsync — служит для запуска потока. 
  • RunWorkerCompleted — вызывается по завершении выполнения потока. 

      Но данный элемент управления выполняется только один раз, для организации циклического запуска и контроля интервала времени между запусками, воспользуемся элементом управления «timer1».
      Перейдите в «Конструктор» главной формы, выполнив сочетание клавиш «Shift+F7». Сделайте двойной клик левой клавишей мыши по компоненту «timer1». Вы перейдете в автоматически созданный метод «timer1_Tick» события «Tick», данное событие возникает при каждом срабатывании таймера через определенный интервал времени указанный в свойстве «Interval», данного элемента управления. Добавьте приведенный ниже листинг запуска выполнения фоновой операции «RunWorkerAsync».

//При каждом срабатывании таймера выполняется проверка
//свойства IsBusy, компонента backgroundWorker1.
//Если значение true, компонент выполняет
//асинхронную операцию и запустить фоновый процесс повторно нельзя,
//в противном случае — значение false
//и производится запуск фоновой операции
if (!backgroundWorker1.IsBusy)
backgroundWorker1.RunWorkerAsync();

      Перейдите в «Конструктор» главной формы, выполнив сочетание клавиш «Shift+F7». Сделайте двойной клик по компоненту «backgroundWorker1» в лотке компонентов. Вы перейдете в автоматически созданный метод «backgroundWorker1_DoWork» события «DoWork», данное событие возникает при каждом вызове метода «System.ComponentModel.BackgroundWorker.RunWorkerAsync()». Добавьте в него приведенный ниже листинг.

System.Net.NetworkInformation.IPv4InterfaceStatistics ipStats =
adapters[NetworkAdapterSelectedIndex].GetIPv4Statistics();
long bytesReceivedInKB = ipStats.BytesReceived / 1024;
long bytesSentInKB = ipStats.BytesSent / 1024;

System.Net.NetworkInformation.IPInterfaceProperties properties =
adapters[NetworkAdapterSelectedIndex].GetIPProperties();

//адреса dns серверов
string dnscollection = string.Empty;
System.Net.NetworkInformation.IPAddressCollection dnsServers =
properties.DnsAddresses;
if (dnsServers.Count > 0)
{
foreach (System.Net.IPAddress dns in dnsServers)
{
dnscollection += dns + "; ";
}
}

//Получение IP адреса версии 4
string IpAddress = string.Empty;
foreach (System.Net.NetworkInformation.IPAddressInformation unicast
in properties.UnicastAddresses)
{
//Так как UnicastAddresses содержит две версии(4,6) Ip адреса
//Выполняем проверку, что это  Ip адрес 4 версии
if (unicast.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
IpAddress += System.Net.IPAddress.Parse(unicast.Address.ToString());
}

//адреса сетевых шлюзов
string GatewayAddresses = string.Empty;
foreach (System.Net.NetworkInformation.GatewayIPAddressInformation address
in properties.GatewayAddresses)
{
GatewayAddresses += address.Address +"; ";
}

//адреса WINS-серверов
string WinsServersAddresses = string.Empty;
foreach (System.Net.IPAddress address in properties.WinsServersAddresses)
{
WinsServersAddresses += address + "; ";
}

outputinfo(
//Описание интерфейса
adapters[NetworkAdapterSelectedIndex].Description,
//Идентификатор сетевого адаптера
adapters[NetworkAdapterSelectedIndex].Id,
//IP адрес сетевого интерфейса
IpAddress,
//МАС-адрес (физический адрес) данного адаптера.
BitConverter.ToString(
adapters[NetworkAdapterSelectedIndex].GetPhysicalAddress().GetAddressBytes()).Replace('-', ':'),
//Тип интерфейса
adapters[NetworkAdapterSelectedIndex].NetworkInterfaceType.ToString(),
//Адреса dns серверов
dnscollection,
//DNS суффикс
properties.DnsSuffix,
//Адреса сетевых шлюзов
GatewayAddresses,
//Возвращает значение true, если на этом интерфейсе настроен NetBIOS
//через TCP/IP для использования разрешения DNS-имен;
//в противном случае — false.
properties.IsDnsEnabled.ToString(),
//адреса WINS-серверов
WinsServersAddresses,
//Скорость сетевого интерфейса
adapters[NetworkAdapterSelectedIndex].Speed.ToString(),
//Число килобайт полученных интерфейсом
String.Format("{0} ({1} байт)", bytesReceivedInKB, ipStats.BytesReceived),
//Число килобайт отправленных интерфейсом
String.Format("{0} ({1} байт)", bytesSentInKB, ipStats.BytesSent));

      Для выбора сетевого интерфейса, к которому вы хотите обратиться, необходимо указать его индекс. Данный индекс берется из свойства «SelectedIndex», элемента управления «comboBox1», которое возвращает или задает индекс, указывающий на выбранный элемент. Но так как вы запускаете процесс получения данных в фоновом потоке, вы получите сообщение об ошибке «Недопустимая операция в нескольких потоках: попытка доступа к элементу управления «comboBox1» не из того потока, в котором он был создан».

      Для устранения данной ошибки, перейдите в «Конструктор» главной формы, нажав на клавиатуре клавишу «Shift+F7» и сделайте двойной клик по элементу управления «comboBox1». Вы перейдете в автоматически созданный метод «comboBox1_SelectedIndexChanged», события «SelectedIndexChanged», происходящего каждый раз при выборе нового элемента из списка который предоставляет данный элемент. Объявите в листинге главной формы переменную «NetworkAdapterSelectedIndex» целочисленного типа «int» с установленным значением равным нулю. В методе «comboBox1_SelectedIndexChanged» добавьте данную переменную и присвойте ей в качестве значения, свойство «ComboBox.SelectedIndex» возвращающее индекс, указывающий выделенный элемент. У вас получится приведенный ниже вариант:

int NetworkAdapterSelectedIndex = 0;
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
NetworkAdapterSelectedIndex = comboBox1.SelectedIndex;
}

Вид работающего проекта представлен ниже.

Ссылка для скачивания примера: Яндекс.Диск

Трафик сетевых интерфейсов локального компьютера: Справочник по C#

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  Генератор паролей: Справочник по C#

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь