Okna podporuje protokol ICMP (Internet Control Message Protocol) k určení, zda je konkrétní hostitel k dispozici. ICMP je protokol síťové vrstvy, který poskytuje řízení toku, chybové zprávy, směrování a další data mezi internetovými hostiteli. ICMP je primárně používán vývojáři aplikací pro ping sítě.
Co je to Ping?
Ping je proces odeslání echo zprávy na IP adresu a přečtení odpovědi pro ověření spojení mezi Hostitelé TCP / IP. Pokud píšete novou aplikaci, budete raději používat podporu surových soketů Winsock 2 implementovanou v systému Indy, například.
Nezapomeňte však, že v případě implementací Windows NT a Windows 2000 jsou Raw Sockets předmětem bezpečnostních kontrol a jsou přístupné pouze členům skupiny administrátora. Icmp.dll poskytuje funkce, které umožňují vývojářům psát aplikace Internet ping v systémech Windows bez podpory Winsock 2.
Všimněte si, že funkce Winsock 1.1 WSAStartup musí být volána před použitím funkcí vystavených ICMP.DLL. Pokud tak neučiníte, první volání IcmpSendEcho se nezdaří s chybou 10091 (WSASYSNOTREADY).
Níže najdete zdrojový kód jednotky Ping. Zde jsou dva příklady použití.
Příklad 1: Úryvek kódu
použití Ping; ...
konst ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
začátek Ping. Ping (ADP_IP) pak ShowMessage („O programu Delphi Programming dosažitelné!“);
konec;
Příklad 2: Program konzoly v režimu Delphi
Naším dalším příkladem je režim konzoly Program Delphi používající jednotku Ping:. Zde je zdroj jednotky Ping:
jednotka Ping;
interfaceuses
Windows, SysUtils, třídy;
typ
TSunB = zabalený záznam
s_b1, s_b2, s_b3, s_b4: byte;
konec;
TSunW = zabalený záznam
s_w1, s_w2: slovo;
konec;
PIPAddr = ^ TIPAddr;
TIPAddr = záznam
pouzdro celé číslo z
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword);
konec; IPAddr = TIPAddr;
funkce IcmpCreateFile: THandle; stdcall; externí 'icmp.dll';
funkce IcmpCloseHandle (icmpHandle: THandle): boolean;
stdcall; externí 'icmp.dll'
funkce IcmpSendEcho
(IcmpHandle: THandle; DestinationAddress: IPAddr;
RequestData: Ukazatel; RequestSize: Smallint;
RequestOptions: ukazatel;
ReplyBuffer: Pointer;
ReplySize: DWORD;
Timeout: DWORD): DWORD; stdcall; externí 'icmp.dll';
funkce Ping (InetAddress: tětiva): boolean;
implementace
WinSock;
funkce Načíst (var Vstup: tětiva;
konst ADelim: tětiva = ' ';
konst ADelete: Boolean = true)
: tětiva;
var
iPos: Celé číslo;
začít
-li ADelim = # 0 pak začít
// AnsiPos nefunguje s # 0
iPos: = Pos (ADelim, AInput);
konec jinak začíná
iPos: = Pos (ADelim, AInput);
konec;
-li iPos = 0 pak začít
Výsledek: = AInput;
-li ADelete pak začít
AInput: = '';
konec;
konec jinak začíná
výsledek: = Kopie (AInput, 1, iPos - 1);
-li ADelete pak začít
Smazat (AInput, 1, iPos + Délka (ADelim) - 1);
konec;
konec;
konec;
postup TranslateStringToTInAddr (AIP: tětiva; var AInAddr);
var
phe: PHostEnt; pac: PChar; GInitData: TWSAData;
začít
WSAStartup (101 $, GInitData);
Snaž se
phe: = GetHostByName (PChar (AIP));
-li Přiřazeno (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
-li Přiřazeno (pac) pak
začít
s TIPAddr (AInAddr) .S_un_b začnou
s_b1: = byte (pac [0]); s_b2: = byte (pac [1]); s_b3: = byte (pac [2]); s_b4: = byte (pac [3]);
konec;
konec
jiný
začít
vyzdvihnout Výjimka. Vytvořit ('Chyba při získávání IP z HostName');
konec;
konec
jiný
začít
vyzdvihnout Výjimka. Create ('Chyba při získávání HostName');
konec;
až na
FillChar (AInAddr, SizeOf (AInAddr), # 0);
konec; WSACleanup;
konec;
funkce Ping (InetAddress: tětiva): boolean;
var
Rukojeť: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: pole[1..128] z byte;
začít
výsledek: = false; Popisovač: = IcmpCreateFile;
-li Popisovač = INVALID_HANDLE_VALUE pak
Výstup;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Handle, InAddr, nula, 0, nula, @rep, 128, 0); Výsledek: = (DWO); IcmpCloseHandle (Handle);
konec;
konec.