Программирование Delphi для реализации операции Ping
Чжан Тайли
Пользователи, пользовавшиеся Интернетом, знакомы с командой «Ping». Это исполняемый файл под DOS. Обычно он используется для проверки качества сетевого соединения. Основной принцип заключается в использовании функции протокола ICMP в пакете протоколов TCP/ip, то есть в отправке запроса указанному компьютеру, а компьютер, получивший запрос, возвращает ответ, чтобы определить, работает ли компьютер на Интернет или проверить сеть, стабильно ли и надежно ли соединение? Во время выполнения программы Ping оба компьютера потребляют очень мало ресурсов, поэтому это очень практичный инструмент.
Мы можем реализовать операцию «Ping» посредством программирования и улучшить ее, чтобы она имела стиль интерфейса Windows, а отображение было более интуитивным, чем DOS.
Во-первых, краткое объяснение библиотеки динамической компоновки, необходимой для программирования: В системном каталоге Windows вы можете найти файл Icmp.dll. Эта библиотека динамической компоновки обеспечивает все функции протокола ICMP. Наше программирование основано на этом. вызов динамической библиотеки.
Вызывающие функции в файле Icmp.dll описаны следующим образом:
1. IcmpCreateFile
Открывает дескриптор, с помощью которого можно отправлять эхо-сообщения запроса ICMP.
2. Икмпклосехандле
Закройте дескриптор, который вы открыли с помощью функции IcmpCreateFile.
3. Икмпсендэхо
Отправьте запрос ICMP через открытый вами дескриптор и верните его после таймаута или получения ответного сообщения. Его параметры в основном соответствуют структуре фрейма. См. программную часть ниже. Конкретное значение можно найти в книгах по протоколу ICMP.
После предварительного понимания трех вышеуказанных функций мы можем приступить к программированию.
Во-первых, после запуска наша программа должна иметь основные функции, показанные на рисунке 1. Для этого мы можем сначала поместить элементы управления, показанные на верхнем правом рисунке, в окно Delphi, такие как кнопки, поля редактирования и поля отображения текста.
(G72.JPG)
Принципиальная схема повседневной работы
Затем в начале программы инициализируется WinSocket (FormCreate). Его функция — объявить используемую информацию о версии и одновременно вызвать библиотеку Icmp.dll.
тип
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = упакованная запись
ТТЛ: байт;
ТОС: Байт;
Флаги: Байт;
ПараметрыРазмер: Байт;
ПараметрыДанные: PChar;
конец;
PIcmpEchoReply = ^TIcmpEchoReply;
TICmpEchoReply = упакованная запись
Адрес: DWord;
Статус: DWORD;
РТТ: ДВОР;
Размер данных: Слово;
Зарезервировано: Слово;
Данные: Указатель;
Параметры: TIPOptionInformation;
конец;
TICmpCreateFile = функция: THandle;
TICmpCloseHandle = функция (IcmpHandle: THandle): Boolean;
TicmpSendEcho = функция (IcmpHandle:THandle;
Адрес назначения: DWORD;
ЗапросДанные: Указатель;
Размер запроса: Слово;
Параметры запроса: PIPOptionInformation;
ОтветБуфер: Указатель;
Размер ответа: DWord;
Тайм-аут: DWord
): DWord;
TMyPing = класс (TForm)
Панель1: ТПанель;
Метка1: TLabel;
PingEdit: TEdit;
ExeBtn: TButton;
Кнопка2: Кнопка T;
Кнопка3: Кнопка T;
СтатусШоу: TMemo;
PROcedure Button3Click (Отправитель: TObject);
процедура FormCreate (Отправитель: TObject);
процедура ExeBtnClick (Отправитель: TObject);
частный
{Частные заявления}
hICMP: THANDLE;
Икмпкреатефиле: тикмпкреатефиле;
IcmpCloseHandle: TicmpCloseHandle;
ИкмпСендЭхо: ТикмпСендЭхо;
общественный
{Публичные заявления}
конец;
процедура TMyPing.FormCreate(Отправитель: TObject);
вар
ВСАДата: TWSAData;
hICMPdll: HMODULE;
начинать
WSAStartup($101, WSAData);
// Загружаем материал icmp.dll
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP := IcmpCreateFile;
СтатусШоу.Текст := ';
StatusShow.Lines.Add('Время возврата байтов IP-адреса назначения (миллисекунды)');
конец;
Затем пришло время выполнить сам процесс программирования операции Ping, как показано ниже.
процедура TMyPing.ExeBtnClick(Отправитель: TObject);
вар
IPopt:TIPOptionInformation;//Параметры IP для отправки пакета
FIP-адрес: DWORD;
pReqData, pRevData: PChar;
pIPE:PIcmpEchoReply;//Буфер эхо-ответа ICMP
Размер: DWORD;
МояСтрока:строка;
ФТимеаут:DWORD;
Размер Буфера: DWORD;
начинать
если PingEdit.Text <> ' то
начинать
FIPAddress:= inet_addr(PChar(PingEdit.Text));
ФСизе:= 40;
BufferSize: = SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
FillChar(pIPE^, SizeOf(pIPE^), 0);
pIPE^.Data := pRevData;
MyString := 'Привет, мир';
pReqData := PChar(MyString);
FillChar(IPOpt, Sizeof(IPOpt), 0);
IPopt.TTL := 64;
ФТимеаут:= 4000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, Длина(MyString), @IPOpt, pIPE, BufferSize, FTimeOut);
если pReqData^ = pIPE^.Options.OptionsData^ тогда
начинать
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
конец;
FreeMem(pRevData);
FreeMem(pIPE);
конец
конец;
С помощью вышеуказанного программирования мы реализовали интерфейсную работу функции Ping. На самом деле существует множество функций протокола ICMP, которые можно реализовать посредством вызовов функций Icmp.dll.