Прилагане на PING без използване на сурови гнезда

Windows поддържа протокол за съобщение за интернет контрол (ICMP), за да определи дали даден хост е наличен или не. ICMP е протокол на мрежовия слой, който предоставя контрол на потока, съобщения за грешки, маршрутизация и други данни между интернет хостове. ICMP се използва главно от разработчиците на приложения за мрежов пинг.

Какво е пинг?

Ping е процесът на изпращане на ехо съобщение до IP адрес и четене на отговора, за да се провери връзка между TCP / IP хостове. Ако пишете ново приложение, ще бъде по-добре да използвате поддръжката на сурови гнезда Winsock 2, внедрена в Indy, например.

Моля, обърнете внимание обаче, че при внедряването на Windows NT и Windows 2000 Raw Sockets подлежат на проверки за сигурност и са достъпни само за членове на групата на администратора. Icmp.dll предоставя функционалност, която позволява на разработчиците да пишат приложения за интернет ping в Windows системи без поддръжка на Winsock 2.

Обърнете внимание, че функцията Winsock 1.1 WSAStartup трябва да бъде извикана преди да използвате функциите, изложени от ICMP.DLL. Ако не направите това, първото обаждане до IcmpSendEcho ще се провали с грешка 10091 (WSASYSNOTREADY).

instagram viewer

По-долу можете да намерите изходния код на модула Ping. Ето два примера за употреба.

Пример 1: Кодов фрагмент

употреби Ping; ...
конст
ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginIf
Ping. Ping (ADP_IP) тогава ShowMessage („Всичко за програмирането на Delphi!“);
край
;

Пример 2: Програма на Delphi в конзолен режим

Следващият ни пример е конзолен режим Програма Delphi който използва модула Ping:. Ето източника на Ping устройството:

мерна единица Ping;
interfaceuses

Windows, SysUtils, класове;
Тип

TSunB = опакован запис
s_b1, s_b2, s_b3, s_b4: byte;
край
;
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; DestinationAddress: IPAddr;
RequestData: указател; RequestSize: Smallint;
RequestOptions: указател;
ОтговорБуфер: указател;
ReplySize: DWORD;
Време за изчакване: DWORD): DWORD; stdcall; външен "Icmp.dll";
функция
Ping (InetAddress: низ): булева;
implementationuses

WinSock;
функция
Изважда (Var AInput: низ;
конст
ADelim: низ = ' ';
конст
ADelete: Boolean = вярно)
: низ;
Var

iPos: Integer;
започвам
ако
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 + дължина (ADelim) - 1);
край
;
край
;
край
;
процедура
TranslateStringToTInAddr (AIP: низ; Var AInAddr);
Var

фе: PHostEnt; pac: PChar; GInitData: TWSAData;
започвам

WSAStartup ($ 101, GInitData);
опитвам

phe: = GetHostByName (PChar (AIP));
ако
Назначен (фе) thenbegin
pac: = phe ^ .h_addr_list ^;
ако
Присвоен (pac) тогава
започвам
с
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: низ): булева;
Var

Дръжка: THandle;
InAddr: IPAddr;
DW: DWORD;
представител: масив[1..128] на байт;
започвам

резултат: = невярно; Дръжка: = IcmpCreateFile;
ако
Дръжка = INVALID_HANDLE_VALUE тогава
Exit;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (дръжка, InAddr, нула, 0, нула, @rep, 128, 0); Резултат: = (DW 0); IcmpCloseHandle (дръжка);
край
;​
край
.