Windows поддерживает протокол управляющих сообщений Интернета (ICMP), чтобы определить, доступен ли конкретный хост. ICMP - это протокол сетевого уровня, который обеспечивает управление потоками, сообщения об ошибках, маршрутизацию и другие данные между узлами Интернета. ICMP в основном используется разработчиками приложений для сетевого пинга.
Что такое пинг?
Пинг - это процесс отправки эхо-сообщения на IP-адрес и чтения ответа для проверки связи между Хосты TCP / IP. Если вы пишете новое приложение, вам будет лучше использовать поддержку сырых сокетов Winsock 2, реализованную в Инди, например.
Обратите внимание, однако, что для реализаций Windows NT и Windows 2000 Raw Sockets проходят проверку безопасности и доступны только членам группы администратора. Icmp.dll предоставляет функциональность, которая позволяет разработчикам писать приложения для пинга в Интернете в системах Windows без поддержки Winsock 2.
Обратите внимание, что функция Winsock 1.1 WSAStartup должна вызываться до использования функций, предоставляемых ICMP.DLL. Если вы этого не сделаете, первый вызов IcmpSendEcho завершится с ошибкой 10091 (WSASYSNOTREADY).
Ниже вы можете найти исходный код модуля Ping. Вот два примера использования.
Пример 1: фрагмент кода
использования Пинг;...
Const ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginIf Пинг. Пинг (ADP_IP) тогда ShowMessage («О программировании на Delphi!»);
конец;
Пример 2: Консольный режим Delphi Program
Наш следующий пример - режим консоли Delphi программа который использует блок Ping:. Вот источник модуля Ping:
единица измерения Пинг;
interfaceuses
Windows, SysUtils, Classes;
тип
TSunB = упакованная запись
s_b1, s_b2, s_b3, s_b4: байт;
конец;
TSunW = упакованная запись
s_w1, s_w2: слово;
конец;
PIPAddr = ^ TIPAddr;
TIPAddr = запись
кейс целое число из
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: длинное слово);
конец; IPAddr = TIPAddr;
функция IcmpCreateFile: THandle; STDCALL; внешний 'Icmp.dll';
функция IcmpCloseHandle (icmpHandle: THandle): логическое значение;
STDCALL; внешний 'Icmp.dll'
функция IcmpSendEcho
(IcmpHandle: THandle; Адрес назначения: IPAddr;
RequestData: указатель; RequestSize: Smallint;
RequestOptions: указатель;
ReplyBuffer: указатель;
ReplySize: DWORD;
Тайм-аут: DWORD): DWORD; STDCALL; внешний 'Icmp.dll';
функция Ping (InetAddress: строка): логическое значение;
implementationuses
WinSock;
функция Fetch (вар AInput: строка;
Const ADelim: строка = ' ';
Const ADelete: Boolean = true)
: строка;
вар
iPos: целое число;
начать
если ADelim = # 0 тогда начинай
// AnsiPos не работает с # 0
iPos: = Pos (ADelim, AInput);
конец еще начало
iPos: = Pos (ADelim, AInput);
конец;
если iPos = 0 тогда начинай
Результат: = AInput;
если ADelete тогда начинай
AInput: = '';
конец;
конец еще начало
результат: = Копировать (AInput, 1, iPos - 1);
если ADelete тогда начинай
Удалить (AInput, 1, iPos + Length (ADelim) - 1);
конец;
конец;
конец;
процедура TranslateStringToTInAddr (AIP: строка; вар AInAddr);
вар
phe: PHostEnt; пак: PChar; GInitData: TWSAData;
начать
WSAStartup ($ 101, GInitData);
пытаться
phe: = GetHostByName (PChar (AIP));
если Назначено (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
если Назначено (пак) тогда
начать
с TIPAddr (AInAddr) .S_un_b начать
s_b1: = байт (pac [0]); s_b2: = байт (pac [1]); s_b3: = байт (pac [2]); s_b4: = байт (pac [3]);
конец;
конец
еще
начать
повышение Исключение. Создать («Ошибка при получении IP с HostName»);
конец;
конец
еще
начать
повышение Исключение. Создать («Ошибка при получении HostName»);
конец;
Кроме
FillChar (AInAddr, SizeOf (AInAddr), # 0);
конец; WSACleanup;
конец;
функция Ping (InetAddress: строка): логическое значение;
вар
Ручка: THandle;
InAddr: IPAddr;
DW: DWORD;
репутация: массив[1..128] из байт;
начать
результат: = ложь; Handle: = IcmpCreateFile;
если Handle = INVALID_HANDLE_VALUE тогда
Выход;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Handle, InAddr, ноль, 0, ноль, @rep, 128, 0); Результат: = (DW 0); IcmpCloseHandle (Handle);
конец;
конец.