Перед використанням функц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 параметри:
· 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; // Адрес отвечающего
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.