C как получить результаты ping
Перейти к содержимому

C как получить результаты ping

Ping Класс

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

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

Примеры

В следующем примере кода демонстрируется синхронное использование Ping класса.

В следующем примере кода демонстрируется асинхронное использование Ping класса.

Комментарии

Приложения используют Ping класс для определения доступности удаленного компьютера.

Топология сети может определить, может ли Ping успешно связаться с удаленным узлом. Наличие и настройка прокси-серверов, оборудования преобразования сетевых адресов (NAT) или брандмауэров может предотвратить Ping успешное выполнение. Ping Успешное выполнение указывает только на то, что удаленный узел можно получить в сети. Наличие служб более высокого уровня (например, веб-сервера) на удаленном узле не гарантируется.

Этот класс предоставляет функциональные возможности, аналогичные средству командной строки Ping.exe. Методы Send отправляют SendAsync сообщение эхо-запроса протокола ICMP на удаленный компьютер и ожидает сообщения ответа ICMP с этого компьютера. Подробное описание сообщений ICMP см. в статье RFC 792, доступной по адресу https://www.ietf.org.

Следующие типы используются с классом Ping и подробно описаны ниже.

Имя типа Описание
IPStatus Определяет коды состояния, описывающие результат сообщения эхо-запроса ICMP.
PingOptions Позволяет настроить или получить параметры, которые управляют тем, сколько раз можно перенаправить пакет запроса (Ttl) и можно ли его фрагментировать (DontFragment ).
PingReply Содержит результаты запроса на эхо ICMP.
PingException Возникает, если возникает неустранимая ошибка.
PingCompletedEventArgs Содержит данные, связанные с событиями PingCompleted , которые возникают при SendAsync завершении вызова или отмене вызова.
PingCompletedEventHandler Делегат, предоставляющий метод обратного вызова, вызываемый при SendAsync завершении или отмене вызова.

Методы Send и SendAsync методы возвращают ответ в объекте PingReply . Свойство PingReply.Status возвращает значение, IPStatus указывающее результат запроса.

При отправке запроса необходимо указать удаленный компьютер. Это можно сделать, указав строку имени узла, IP-адрес в строковом IPAddress формате или объект.

Можно также указать любой из следующих типов сведений:

Данные для сопровождения запроса. Указание buffer позволяет узнать, сколько времени требуется для пакета определенного размера для перемещения в удаленный узел и из нее, а также максимальной единицы передачи сетевого пути. (См. Send или SendAsync перегрузки, которые принимают buffer параметр.)

Может ли пакет ICMP Echo быть фрагментирован при передаче. (См. DontFragment свойство и Send SendAsync перегрузки, которые принимают options параметр.)

Сколько раз узлы маршрутизации, такие как маршрутизаторы или шлюзы, могут пересылать пакет до того, как он достигнет конечного компьютера или будет удален. (См Ttl . и Send SendAsync перегрузки, которые принимают options параметр.)

Ограничение времени, в течение которого должен быть получен ответ. (См Send . или SendAsync перегрузки, которые принимают timeout параметр.

Класс Ping предлагает синхронные и асинхронные методы для отправки запроса. Если приложение должно блокироваться во время ожидания ответа, используйте Send методы. Эти методы синхронны. Если приложение не должно блокироваться, используйте асинхронные SendAsync методы. Вызов SendAsync выполнения в собственном потоке, который автоматически выделяется из пула потоков. После завершения асинхронной операции событие вызывается PingCompleted . Приложения используют PingCompletedEventHandler делегат для указания метода, вызываемого для PingCompleted событий. Перед вызовом PingCompletedEventHandler SendAsyncнеобходимо добавить делегат в событие. Метод делегата получает PingCompletedEventArgs объект, содержащий PingReply объект, описывающий результат SendAsync вызова.

Вы не можете использовать один и тот же экземпляр Ping класса для создания нескольких одновременных запросов ICMP Echo. Вызов Send во время SendAsync выполнения вызова или вызов SendAsync несколько раз до завершения всех предыдущих вызовов приводит к возникновению InvalidOperationExceptionошибки.

Конструкторы

Инициализирует новый экземпляр класса Ping.

Свойства

Возвращает значение, показывающее, может ли компонент вызывать событие.

Возвращает объект IContainer, который содержит коллекцию Component.

Возвращает значение, указывающее, находится ли данный компонент Component в режиме конструктора в настоящее время.

Возвращает список обработчиков событий, которые прикреплены к этому объекту Component.

Получает или задает ISite объекта Component.

Методы

Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.

Освобождает неуправляемые ресурсы и удаляет управляемые ресурсы, используемые объектом Ping.

Освобождает все ресурсы, занятые модулем Component.

Освобождает неуправляемые ресурсы, используемые объектом Ping, и опционально — управляемые ресурсы.

Освобождает неуправляемые ресурсы, используемые объектом Component, а при необходимости освобождает также управляемые ресурсы.

Определяет, равен ли указанный объект текущему объекту.

Служит хэш-функцией по умолчанию.

Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.

Возвращает объект, представляющий службу, предоставляемую классом Component или классом Container.

Возвращает объект Type для текущего экземпляра.

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

Создает неполную копию текущего объекта Object.

Создает неполную копию текущего объекта MarshalByRefObject.

Предпринимает попытку отправки сообщения запроса проверки связи ICMP на удаленный компьютер с указанным IPAddress и получения от него соответствующего сообщения ответа проверки связи ICMP.

Предпринимает попытку отправки сообщения запроса проверки связи ICMP с заданным буфером данных на удаленный компьютер с указанным IPAddress и получения от него соответствующего сообщения ответа проверки связи ICMP. Этот метод позволяет указать тайм-аут операции.

Предпринимает попытку отправки сообщения запроса проверки связи ICMP с заданным буфером данных на удаленный компьютер с указанным IPAddress и получения от него соответствующего сообщения ответа проверки связи ICMP. Эта перегруженная версия метода позволяет указать тайм-аут операции.

Предпринимает попытку отправки сообщения запроса проверки связи ICMP с заданным буфером данных на удаленный компьютер с указанным IPAddress и получения от него соответствующего сообщения ответа проверки связи ICMP. Эта перегруженная версия метода позволяет указать тайм-аут операции и управлять значениями фрагментации и срока жизни пакета сообщения проверки связи ICMP.

Предпринимает попытку отправки сообщения запроса проверки связи ICMP на указанный компьютер и получения от него соответствующего сообщения ответа проверки связи ICMP.

Предпринимает попытку отправки сообщения запроса проверки связи ICMP на указанный компьютер и получения от него соответствующего сообщения ответа проверки связи ICMP. Этот метод позволяет указать тайм-аут операции.

Предпринимает попытку отправки сообщения запроса проверки связи ICMP с заданным буфером данных на указанный компьютер и получения от него соответствующего сообщения ответа проверки связи ICMP. Эта перегруженная версия метода позволяет указать тайм-аут операции.

Предпринимает попытку отправки сообщения запроса проверки связи ICMP с заданным буфером данных на указанный компьютер и получения от него соответствующего сообщения ответа проверки связи ICMP. Эта перегруженная версия метода позволяет указать тайм-аут операции и управлять значениями фрагментации и срока жизни пакета ICMP.

Предпринимает попытку асинхронной отправки сообщения запроса проверки связи ICMP с заданным буфером данных на компьютер с указанным IPAddress и получения от него соответствующего сообщения ответа проверки связи ICMP. Эта перегруженная версия метода позволяет указать тайм-аут операции.

Предпринимает попытку асинхронной отправки сообщения запроса проверки связи ICMP с заданным буфером данных на компьютер с указанным IPAddress и получения от него соответствующего сообщения ответа проверки связи ICMP. Эта перегруженная версия метода позволяет указать тайм-аут операции и управлять значениями фрагментации и срока жизни пакета сообщения проверки связи ICMP.

Предпринимает попытку асинхронной отправки сообщения запроса проверки связи ICMP на удаленный компьютер с указанным IPAddress и получения от него соответствующего сообщения ответа проверки связи ICMP. Эта перегруженная версия метода позволяет указать тайм-аут операции.

Предпринимает попытку асинхронной отправки сообщения запроса проверки связи ICMP на удаленный компьютер с указанным IPAddress и получения от него соответствующего сообщения ответа проверки связи ICMP.

Предпринимает попытку асинхронной отправки сообщения запроса проверки связи ICMP с заданным буфером данных на указанный компьютер и получения от него соответствующего сообщения ответа проверки связи ICMP. Эта перегруженная версия метода позволяет указать тайм-аут операции.

Предпринимает попытку асинхронной отправки сообщения запроса проверки связи ICMP с заданным буфером данных на указанный компьютер и получения от него соответствующего сообщения ответа проверки связи ICMP. Эта перегруженная версия метода позволяет указать тайм-аут операции и управлять значениями фрагментации и срока жизни пакета ICMP.

Предпринимает попытку асинхронной отправки сообщения запроса проверки связи ICMP на указанный компьютер и получения от него соответствующего сообщения ответа проверки связи ICMP. Эта перегруженная версия метода позволяет указать тайм-аут операции.

Предпринимает попытку асинхронной отправки сообщения запроса проверки связи ICMP на указанный компьютер и получения от него соответствующего сообщения ответа проверки связи ICMP.

Отменяет все ожидающие асинхронные запросы на отправку сообщений проверки связи ICMP и получает соответствующее сообщение ответа проверки связи ICMP.

Отправляет сообщение запроса проверки связи ICMP с заданным буфером данных на компьютер с указанным IPAddress и получает от него соответствующее сообщения ответа проверки связи ICMP как асинхронная операция.

Отправляет сообщение запроса проверки связи ICMP с заданным буфером данных на компьютер с указанным IPAddress и получает от него соответствующее сообщения ответа проверки связи ICMP как асинхронная операция. Эта перегруженная версия метода позволяет указать тайм-аут операции.

Отправляет сообщение запроса проверки связи ICMP с заданным буфером данных на компьютер с указанным IPAddress и получает от него соответствующее сообщения ответа проверки связи ICMP как асинхронная операция. Эта перегрузка позволяет указать значение истечения времени ожидания для операции и буфер для использования для отправки и получения.

Отправляет сообщение запроса проверки связи ICMP с заданным буфером данных на компьютер с указанным IPAddress и получает от него соответствующее сообщение ответа проверки связи ICMP в виде асинхронной операции. Эта перегруженная версия метода позволяет указать тайм-аут операции, буфер для использования для отправки и получения и управлять значениями фрагментации и срока жизни пакета сообщения проверки связи ICMP.

Отправляет сообщение запроса проверки связи ICMP с заданным буфером данных на указанный компьютер и получает от него соответствующее сообщения ответа проверки связи ICMP как асинхронная операция.

Отправляет сообщение запроса проверки связи ICMP с заданным буфером данных на указанный компьютер и получает от него соответствующее сообщения ответа проверки связи ICMP как асинхронная операция. Эта перегруженная версия метода позволяет указать тайм-аут операции.

Отправляет сообщение запроса проверки связи ICMP с заданным буфером данных на указанный компьютер и получает от него соответствующее сообщения ответа проверки связи ICMP как асинхронная операция. Эта перегрузка позволяет указать значение истечения времени ожидания для операции и буфер для использования для отправки и получения.

Отправляет сообщение запроса проверки связи ICMP с заданным буфером данных на указанный компьютер и получает от него соответствующее сообщения ответа проверки связи ICMP как асинхронная операция. Эта перегруженная версия метода позволяет указать тайм-аут операции, буфер для использования для отправки и получения и управлять значениями фрагментации и срока жизни пакета сообщения проверки связи ICMP.

Возвращает объект String, содержащий имя Component, если оно есть. Этот метод не следует переопределять.

Возвращает строку, представляющую текущий объект.

События

Возникает при удалении компонента путем вызова метода Dispose().

Происходит при завершении или отмене асинхронной операции отправки сообщения проверки связи ICMP и получения соответствующего сообщения ответа проверки связи ICMP.

Пишем ping на Си

Видите это довольное лицо? Это Майк Муусс — автор, наверное самой часто используемой утилиты ping (недаром он на фотке так радуется).

Некоторое время назад мне самому довелось написать ping, но в виде отдельной функции.

И на мой взгляд, для си-программистов, которые только начинают работать с сетью, это очень полезная утилита для самостоятельной разработки. Почему? Потому, что для разработки этой утилиты нужно научится делать, казалось бы, самые примитивные действия — отправлять и принимать пакет.

Давайте сначала вкратце определим требования конкретно для нашей функции ping. Функция нужна нам для проверки целостности и качества соединения между хостами. И для этого нам достаточно отправить ICMP-эхопакет с запросом целевому хосту и получить от нее ответ. Для оценки качества соединения будем использовать время между запросом и получением ответа.

Системные вызовы

Операционная система (в нашем случае Linux) позволяет получать доступ к сетевым устройствам посредством системных вызовов. Для ping мне потребовались следующие вызовы:

  • socket — используется для создания сокета
  • select — в нашем случае используется для проверки состояния сокета
  • sendto — для отправки данных
  • recvfrom — для получения данных
  • inet_aton — для преобразования ip-aдреса в строковом виде в структуру sockaddr_in
  • и другие

Реализация

Функция для получения текущего времени

Для начала напишем вспомогательную функцию для получения текущего времени в миллисекундах.

Данные

Далее нужно определится с тем, какие данные будем отправлять. Объявим структуру, который будет иметь icmp заголовок и поле данных. Эта структура будет служить нашим пакетом.

Напишем функцию для заполнения нашей структуры.

Функция ping

Сигнатура нашей основной функции будет следующим.

На входе мы получаем ip-адрес пингуемого хоста и таймаут ожидания. На выходе результат выполнения и третий аргумент time куда запишем время пинга хоста.

Тут же, с помощью inet_aton , преобразуем ip в строковом виде в структуру sockaddr_in .

Сокет

Далее нам нужно создать сокет путем вызова соответствующей функции.

Директива SOCK_RAW говорит о том, что мы отправляем “сырой” пакет без использования транспортного уровня (UDP/TCP). С помощью директивы IPPROTO_ICMP говорим, что мы будем использовать протокол ICMP. Функция socket() возвращает нам файловый дескриптор, который будем использовать в последующем.

Отправляем пакет

Перед тем как отправить пакет фиксируем время.

И отправляем пакет.

Получаем ответ

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

Таймауты

Далее на мой взгляд идет самая сложная часть. Делать вызов recvfrom , то есть принимать данные из сети, нам нужно только при наличии данных. Для этого нам поможет системный вызов select , который используется для отслеживания состояния сокета. А именно:

  • Я взвожу select на требуемый таймаут, после чего происходит блокировка на этой функции до момента пока не появятся данные или не истечет время
  • Если select разблокировался по таймауту, значит время истекло и мы выходим из цикла
  • Если select разблокировался из-за появления данных, то вызываем recvfrom и записываем данные в структуру ip_pkt
  • Если данные адресованы не нам, взводим select заново, ведь у нас еще осталось время

Запуск

Компилируем, запускаем ping и видим, что все работает.

Стоп! Но почему для запуска требуется sudo? А потому, что мы используем сырые пакеты. Помните директиву SOCK_RAW ?

Тогда почему стандартная утилита ping не требует sudo? Ничего страшного. Пара нехитрых действий и наш ping тоже запускается без sudo.

Если есть вопросы или замечания — пишите! Я обязательно постараюсь ответить. Спасибо!

Ping in C

Prerequisites : ICMP | Raw Socket | Internet Checksum | DNS Ping is a necessity for debugging of the Internet. Ping is a basic Internet tool that allows a user to verify that a particular IP address exists and can accept requests., with other facilities. Ping sends out ICMP packets by opening a RAW socket, which is separate from TCP and UDP. Since IP does not have any inbuilt mechanism for sending error and control messages. It depends on Internet Control Message Protocol (ICMP) to provide an error control. It is used for reporting errors and management queries. Example of Ubuntu Ping

Working Mechanism The Internet Ping program works much like a sonar echo-location, sending a small packet of information containing an ICMP ECHO_REQUEST to a specified computer, which then sends an ECHO_REPLY packet in return. The packet has a TTL (time-to-live) value determining max number of router hops. If the packet does not reach, then the sender is noted back with the error. Errors are of following types:

  • TTL Expired in Transit
  • Destination Host Unreachable
  • Request Timed Out i.e. no reply
  • Unknown Host

Implementation The steps followed by a simple ping program are:

  1. Take a hostname as input
  2. Do a DNS lookup

DNS lookup can be done using gethostbyname(). The gethostbyname() function converts a normal human readable website and returns a structure of type hostent which contains IP address in form of binary dot notation and also address type.

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

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