Домой Network Чтение ARP таблицы: Справочник по C#

Чтение ARP таблицы: Справочник по C#

698
0


ARP (Address Resolution Protocol — протокол определения адреса) — протокол в компьютерных сетях, предназначенный для определения MAC адреса по известному IP адресу. В данном примере рассмотрено получение ARP таблицы локального компьютера. Для этого используется свойство «StandardOutput» из класса «Process», которое позволяет получить поток, используемый для чтения вывода приложения. В качестве источника вывода данных используется командная строка с запуском команды «arp -a», которая отображает текущие ARP записи, опрашивая текущие данные протокола. Если ARP используют более одного сетевого интерфейса, то будут отображаться записи для каждой таблицы.

public static StreamReader ExecuteCommandLine(String file, String arguments = "")
{
ProcessStartInfo startInfo = new ProcessStartInfo();

//Задаем значение, указывающее необходимость запускать
//процесс в новом окне.
startInfo.CreateNoWindow = true;

//Устанавливаем скрытый стиль окна. Окно может быть видимым или скрытым.
//Система отображает скрытое окно, не прорисовывая его.
//Если окно скрыто, оно эффективно отключено.
//Скрытое окно может обрабатывать сообщения от системы или
//от других окон, но не может обрабатывать ввод от пользователя
//или отображать вывод. Часто, приложение может держать новое окно
//скрытым, пока приложение определит внешний вид окна, а затем
//сделать стиль окна Normal.
startInfo.WindowStyle = ProcessWindowStyle.Hidden;

//Задаем значение, указывающее, что не нужно использовать
//оболочку операционной системы для запуска процесса.
startInfo.UseShellExecute = false;

//Задаем значение, указывающее необходимость записывать выходные
//данные приложения в поток System.Diagnostics.Process.StandardOutput.
startInfo.RedirectStandardOutput = true;

//Задаем приложение для запуска.
startInfo.FileName = file;

//Задаем набор аргументов командной строки, используемых при
//запуске приложения.
startInfo.Arguments = arguments;

//Задаем предпочтительную кодировку для стандартного вывода.
startInfo.StandardOutputEncoding = Encoding.GetEncoding(866);

//Запускам ресурс процесса, с указанными выше параметрами и связываем
//ресурс с новым компонентом System.Diagnostics.Process.
Process process = Process.Start(startInfo);

//Возвращаем System.IO.StreamReader, который может использоваться
//для чтения потока стандартного вывода приложения.
return process.StandardOutput;
}

      Что бы воспользоваться приведенным выше методом и разобрать полученные данные, добавьте приведенный ниже листинг в метод «Form_Load» главной формы или в метод «Button_Click» элемента управления «Button».

//Инициализируем новую таблицу
DataTable dt = new DataTable();

//Создаем три колонки
dt.Columns.Add("Адрес в интернете");
dt.Columns.Add("Физический адрес");
dt.Columns.Add("Тип");

//Заносим в переменную поток данных из консольного приложения
var arpStream = WindowsFormsARPTable.Form1.ExecuteCommandLine("arp", "-a");

//Удаляем первые три строки, т.к они содержат
//пустую строку
//имя интерфейса
//заголовки столбцов
for (int i = 0; i < 3; i++)
{
arpStream.ReadLine();
}

//Циклически проходим по входному потоку
//Пока функция EndOfStream не вернет значение true
//указывающая, что текущая позиция потока
//находится в конце потока
while (!arpStream.EndOfStream)
{
//Получаем одну строку из текущего потока
var line = arpStream.ReadLine().Trim();

//Так как между столбцами есть несколько пробелов
//их необходимо сократить до одного
while (line.Contains("  "))
{
line = line.Replace("  ", " ");
}

//Чтобы распределить полученные данные по столбцам таблицы их
// необходимо разделить с помощью метода Split
// который возвращает массив, элементы которого содержат
//подстроки данного экземпляра, разделенные одним или более
//знаками указанных в его значении.
var parts = line.Split(' ');

//Если значение первого столбца пустое, значит
//данную строку необходимо пропустить
if (parts[0].Trim() != string.Empty)
{
//Если первое значение не пустое
//создаем строку с использованием трех параметров и
//добавляем его в System.Data.DataRowCollection.
dt.Rows.Add(new object[]
{
parts[0].Trim(),
parts[1].Trim(),
parts[2].Trim()
});
}
}

Ниже приведен пример работы тестовой программы.

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

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

Чтение ARP таблицы: Справочник по C#

0.00 (0%) 0 votes

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

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