Ping C#: параллельное выполнение

Ping c#: параллельное выполнение

Всем доброго времени суток. На связи Алексей Гулынин. В данной статье я бы хотел реализовать задачу, которая возможно будет полезна многим администраторам. Пусть у нас в текстовом файле имеется список имен рабочих станций. Задача: проверить доступность рабочей станции стандартной командной “ping”. Далее, если рабочая станция доступна, то проверить существование папки “admin$”. Бывает, что пользователи домена каким-либо образом (в данной статье не будем говорить как такое можно сделать) убирают из группы администраторов своей машины учетные записи пользователей, которые такими правами обладают (например, администраторы домена или специалисты технической поддержки, которые удаленно подключаются к пользователю в случае возникновения у него проблем). В этом случае подключиться к машине не получится.

Для того, чтобы выявить таких недобросовестных пользователей реализуем код на C#. Пояснения к коду будут в комментариях:

// Подключаем пространства имён
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net.NetworkInformation;

namespace PingSystemAndCheckAdminShare
{
    class Program
    {
        // данная коллекция будет содержать имена рабочих станций
        private static List<string> hosts = new List<string>();

        public static void Main()
        {
            // В переменную hosts записываем все рабочие станции из файла
            hosts = getComputersListFromTxtFile("D:\computersList.txt");
            // Создаём Action типизированный string, данный Action будет запускать функцию Pinger
            Action<string> asyn = new Action<string>(Pinger);
            // Для каждой рабочей станции запускаем Pinger'а
            hosts.ForEach(e =>
            {
                asyn.Invoke(e);
            });
            Console.ReadKey();

        }
        
        // Функция получения списка рабочих станций из файла
        private static List<string> getComputersListFromTxtFile(string pathToFile)
        {
            List<string> computersList = new List<string>();
            using (StreamReader sr = new StreamReader(pathToFile, Encoding.Default))
            {
                string line = "";
                while ((line = sr.ReadLine()) != null)
                {
                    computersList.Add(line);
                }
            }
            return computersList;
        }
        
        // Функция записи проблемных рабочих станций в файл
        private static void writeProblemComputersToFile(string fullPathToFile, List<string> problemComputersList)
        {
            using (StreamWriter sw = new StreamWriter(fullPathToFile, true, Encoding.Default))
            {
                problemComputersList.ForEach(e => {sw.WriteLine(e);});    
            }
        }
        
        // Проверяем доступна ли папка admin$
        private static bool checkAdminShare(string computerName)
        {
            if (Directory.Exists("\\"   computerName   "\admin$"))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        
        // Наш основной класс, который будет отправлять команду ping
        async private static void Pinger(string hostAdress)
        {
            // Создаём экземпляр класса Ping
            Ping png = new Ping();
            try
            {
                // Пингуем рабочую станцию hostAdress
                PingReply pr = await png.SendPingAsync(hostAdress);
                List<string> problemComputersList = new List<string>();
                Console.WriteLine(string.Format("Status for {0} = {1}, ip-адрес: {2}", hostAdress, pr.Status, pr.Address));
                // Если рабочая станция пингуется и папка admin$ недоступна,
                // то такую машину заносим в список
                if (pr.Status == IPStatus.Success && !checkAdminShare(hostAdress)) 
                {
                    problemComputersList.Add(hostAdress);
                }
                // Записываем в файл все проблемные машины
                writeProblemComputersToFile("D:\problemsWithAdminShare.txt", problemComputersList);
            }
            catch
            {
                Console.WriteLine("Возникла ошибка! "   hostAdress);
            }
        }
    }
}

Особенностью метода Pinger является то, что он будет выполняться асинхронно. На это указывает ключевое слово “async”. У класса “Ping” есть асинхронный метод “SendPingAsync”, который и будет распараллелен (стоит ключевое слово “await”).

:/>  Инженерный калькулятор онлайн KALKPRO.RU - самый точный калькулятор корней, степеней, синусов, косинусов, логарифмов!

Также отмечу, что в данном случае исключение срабатывает, когда в DNS отсутствует запись, соответствующая имени рабочей станции, т.е. по имени не удаётся определить ip-адрес, т.к. этой записи нет.

В данной статье вы узнали как параллельно выполнить команду ping в C#.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.

Базовые знания

1. Протокол ICMPИнформационный протокол управления Интернетом (протокол essage Internet CONTROLM) для отчетов об ошибках и отладки. Этот протокол является субпротоколом в наборе протоколов TCP / IP и относится к протоколу сетевого уровня и в основном используется для передачи управляющей информации между хостом и маршрутизатором, включая сообщения об ошибках, обмен ограниченным управлением и информацию о состоянии.

Когда данные IP не могут получить доступ к цели, маршрутизатор IP не может переслать пакет данных с текущей скоростью передачи и т. Д., Он автоматически отправит сообщение ICMP. Мы можем отправить сообщение запроса ответа ICMP с помощью команды Ping и записать полученное ответное сообщение ответа ICMP и использовать эти сообщения, чтобы предоставить ссылку для сбоя сети или хоста.

2. Как работает PingПринцип Ping состоит в том, чтобы сначала установить канал, а затем отправить пакет, и другая сторона возвращает сообщение после его принятия. Этот пакет включает в себя, как минимум, следующее: При отправке содержимое пакета включает в себя IP-адрес другой стороны и свой собственный.

Адрес и серийный номер, при отправке назад, включая адреса обеих сторон, а также время, главным образом потому, что получатель находится в ядре операционной системы, прослушивая все время. Программа Ping генерирует icmp «запрос обратной связи» и отправляет его на хост назначения. Определив, можно ли получить ответ от целевого хоста, вы можете узнать сетевое подключение.

:/>  Как отключить клавиатуру на ноутбуке с Windows 7

3. Формат сообщения ICMP

4. Формат IP-сообщения

5. Как использовать оригинальный сокет WinSock и APIВ процессе программирования оригинального сокета Winsock программирование сервера / клиента выполняется в следующем порядке:Инициализировать сокет (WSAStartup)Создать сокет (сокет или WSASocket)Связь с сервером (sendto / recvfrom)закрывает сокет (closesocket)Конечное использование сокета (WSACleanup)

6. Три адресных структуры WinSockstructure Структура адреса Winsock sockaddr используется для хранения информации об их адресах для сокетов в различных областях связи.address Структура адреса Winsock sockaddr_in специально для домена связи в Интернете③ Структура, предназначенная для хранения IP-адресов in_addr

7. При программировании вам необходимо использовать некоторые функции Windows, например:(1)int WSAStartup(WORD wVersionRequested,LPWSADA TA lpWSAData); Описание функции: для вызова любой функции Winsock API в приложении в первую очередь необходимо инициализировать службу Winsock через функцию WSAStartup, поэтому необходимо вызвать функцию WSAStartup.

Программы, использующие Socket, должны вызывать функцию WSAStartup перед использованием Socket. Первый параметр этой функции указывает версию сокета, запрошенную программой, где старший байт указывает младшую версию, а младший байт указывает основную версию, операционная система использует второй параметр для возврата информации о версии запрошенного сокета.

Когда приложение вызывает функцию WSAStartup, операционная система выполняет поиск соответствующей библиотеки Socket в соответствии с запрошенной версией Socket, а затем связывает найденную библиотеку Socket с приложением. После этого приложение может вызывать другие функции сокетов в запрошенной библиотеке сокетов.(2)

SOCKET socket( int af, int type, int protocol ); Описание функции: приложение вызывает функцию сокета, чтобы создать сокет, способный к сетевой связи.Первый параметр указывает семейство протоколов обмена данными, используемых приложением. Для семейства протоколов TCP / IP этот параметр имеет значение AF_INET; второй параметр указывает тип создаваемого сокета, Тип сокета потока – SOCK_STREAM, тип сокета дейтаграммы – SOCK_DGRAM, а интерфейс необработанного сокета SOCK_RAW не применяет определенный протокол для его инкапсуляции, но программа сама обрабатывает пакеты данных и заголовок протокола, третье Этот параметр указывает протокол связи, используемый приложением.(3).

int sendto( SOCKET s, const char FAR *buf, int len,int flags, const struct sockaddr FAR *to, int tolen); Описание функции:Возвращаемое значение: длина фактически отправленных данных.сокет параметра sразмер буфера буфера данных для отправки размер буфера длинаФлаги Флаг режима вызова, обычно 0, изменение Флаги изменит формат, отправленный SendtoУказатель Addr на адрес целевого сокетаДлина адреса, указанного адресом Len(4)

:/>  Как настроить переключение раскладки в Windows 10

int recvfrom(SOCKET s, char FAR* buf, int len, int flags,struct sockaddr FAR *from, int FAR *fromlen ); Описание функции: recvfrom () используется для получения данных от удаленного хоста через указанный сокет и передачи данных в область памяти, указанную параметром buf, параметр len – это данные, которые можно получить Максимальная длина. См.

Флаги, обычно устанавливаемые в 0. Для других значений обратитесь к recv (). Параметр from используется для указания передаваемого сетевого адреса. Для структуры sockaddr, пожалуйста, обратитесь к функции bind (). Параметр fromlen – это длина структуры sockaddr.

Разработка алгоритма

Для реализации процедуры ping вам необходимо выполнить следующие шаги:
(1) Создайте необработанный сокет с типом протокола IPPROTO_ICMP и установите свойства сокета.
(2) Создание и инициализация пакетов ICMP.
(3) Вызовите функцию sendto для отправки ICMP-запроса на удаленный хост.
(4) Вызовите функцию recfrom, чтобы принять ответ ICMP.
Дизайн и реализация программы Ping можно условно разделить на четыре модуля: модуль инициализации, модуль управления функциями, модуль ping и модуль тестирования mian.
Ping C#: параллельное выполнение
1. Модуль инициализации. Этот модуль используется для определения и инициализации различных глобальных переменных и загрузки тела winsock для winsock. В основном это включает определение формата заголовка IP, определение формата заголовка ICMP, определение запроса ответа ICMP и определение ответа ответа ICMP.
Ping C#: параллельное выполнение
2. Модуль управления функциями: этот модуль вызывается другими модулями, в его функции входит вычисление контрольной суммы, отправка запроса на ответ, получение ответа на запрос и анализ, ожидание ответа на запрос.
Рассчитать контрольную сумму
Ping C#: параллельное выполнение
Отправить запрос
Ping C#: параллельное выполнение
Получите ответ и проанализируйте
Ping C#: параллельное выполнение
ожидает ответа
Ping C#: параллельное выполнение
3. Функциональный модуль модуля Ping. Этот модуль является основным модулем этой программы, вызывайте другие модули для достижения его функции.
Да, а затем реализуйте функцию Ping.
Ping C#: параллельное выполнение
4. основной () функциональный модуль: отправьте сообщение с эхо-запросом на указанное доменное имя или IP-адрес; результат Ping отображается в соответствии с ответным сообщением
Ping C#: параллельное выполнение

Оставьте комментарий