Реализация PING без использования сырых сокетов

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).

instagram viewer

Ниже вы можете найти исходный код модуля 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);
конец
;​
конец
.
instagram story viewer