Утиліта PING. Розробка системи діагностики мережі, страница 2

Перед використанням функцiй Icmp.dll необхiдно викликати функцiю WSAStartup() з Winsock. Якщо  цього не зробити, то перший же виклик функцiї IcmpSendEcho() призведе до помилки 10091 (WSASYSNOTREADY).

Якщо функцiя повернула 0, то для бiлш детальної дiагностики виникнувшої помилки використовується функцiя GetLastError(). Перевiряється наявнiсть вузла.

Функцiя IcmpSendEcho() вiдсилає ICMP луна-запит за заданою IP адресою та помiщає всi вiдповiдi, отриманi за час заданого таймаута, в буфер вiдповiдей (ReplyBuffer).

Функцiя IcmpSendEcho приймає наступнi параметри:            

  • IcmpHandle - iдентифiкатор з’єднання, установленого за допомогою IcmpCreateFile;
  • DestAddress - адреса пiнгуємого хоста;
  • RequestData - буфер з даними, якi вiдсилаються при запитi;
  • RequestSize - розмiр буфера запитiв;
  • RequestOptns - додатковi властивостi запиту;

·  ReplyBuffer - адреса буфера для приймання результату;

·  ReplySize - розмер буфера для приймання;

·  Timeout - час, пiд час якого ми чекаємо вiдповiдь  вiд хоста;

Також за допомогою функцiї GetLastError() перевiряється помилка на перевищєння iнтервала чекання для запиту.

Якщо iнтервал чекання не перевищено, то ми отримаємо луна-вiдповiдь яка заноситься в ReplyBuffer. Тудиж заноситься час, пiд час якого ми чекаємо вiдповiдь вiд хоста. Проводиться аналiз отриманих даних та отримуємо максимальне, мiнiмальне та середнє значення часу чекання. Пiдраховуємо кiлькiсть луна-вiдповiдей та закриваємо з’єднання.

1)  Пропонується ввести мережеве ім’я комп’ютера в полі edit1.text

2)  hIP := IcmpCreateFile(); - створення handle файлу, з яким будемо працювати надалі (для з’єднання).

3)  GetMem(pIpe, sizeof(icmp_echo_reply) + sizeof(pingBuffer); - виделення пам’яті для буферу (pIpe– вказівник ,sizeof(icmp_echo_reply) + sizeof(pingBuffer) – розмір буферу)

4)  wVersionRequested := MakeWord(1,1) – визначення версії  інтерфейса Windows Sockets з подальшою його ініціалізацією error := WSAStartup(wVersionRequested,lwsaData) і перевіркою на наявність помилки ініціалізації

5)  s := pchar(edit1.Text); - перетворення типів (з string в pchar)

6)  pHostEn := gethostbyname(s); - повернення адреси хосту

7)  error := GetLastError(); - повернення помилки визначення адреси хосту

8)  destAddress := PInAddr(pHostEn^.h_addr_list^)^; - визначення  адреси IP по імені хосту

9)  Memo1.Lines.Add('Обмен пакетами с '+pHostEn^.h_name+' ['+inet_ntoa(destAddress)+'] '+' по '+IntToStr(sizeof(pingBuffer))+' байт:'); - ввод в діалог інформаційної строки, де функція inet_ntoa(destAddress) – перетворення адреси IP в текстовую строку).

10)  for i:=1 to n do – цикл на n проходів

11)  IcmpSendEcho(hIP,destAddress.S_addr,@pingBuffer,sizeof(pingBuffer),@IP,pIpe,sizeof(icmp_echo_reply)+sizeof(pingBuffer), 1000); - посилка ехо-запиту  через відповідне з’єднання даних (ip-пакета) і отримання відповіді. (hIP – ідентифікатор з’єднання, destAddress.S_addr – адреса пінгуємого хосту, @pingBuffer – буфер з даними, які посилаються при запиті, sizeof(pingBuffer) – розмір буферу запита, @IP  - додаткові властивості запиту, pIpe– адреса буферу для прйому результату, sizeof(icmp_echo_reply)+sizeof(pingBuffer) – розмір буферу прийому, 1000 – час, (в мілісекундах) на протязі якого, очікується відповідь).

12)  error:=GetLastError(); - визначення помилки невдалої посилки-отримання запиту

13)  Визначення максимального, мінімального та середнього часу

14)  IcmpCloseHandle(hIP); - закриття з’єднання

15)  WSACleanup(); - звільнення ресурсів, отриманих у ОС для роботи з Windows Sockets

16)  FreeMem(pIpe); - звільнення пам’яті, що виділена для буферу

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, WinSock, StdCtrls, ComCtrls, ExtCtrls;

type

  TForm1 = class(TForm)

    Button1: TButton;

    Edit1: TEdit;

    memo1: TMemo;

    Edit2: TEdit;

    Label1: TLabel;

    Label2: TLabel;

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

implementation

type

    ip_option_information = packed record  // Информация заголовка IP

        Ttl : byte;                // Время жизни

        Tos : byte;                // Тип обслуживания, обычно 0

        Flags : byte;               // Флаги заголовка IP, обычно 0

        OptionsSize : byte;        // Размер данных в заголовке, обычно 0, максимум 40

        OptionsData : Pointer;     // Указатель на данные

    end;

   icmp_echo_reply = packed record

        Address : u_long;            // Адрес отвечающего