Windows podpira protokol za nadzor internetnega nadzora (ICMP), da ugotovi, ali je določen gostitelj na voljo ali ne. ICMP je protokol omrežnega sloja, ki med internetnimi gostitelji zagotavlja nadzor pretoka, sporočila o napakah, usmerjanje in druge podatke. ICMP uporabljajo predvsem razvijalci aplikacij za omrežni ping.
Kaj je ping?
Ping je postopek pošiljanja odmeva na naslov IP in branje odgovora, da se preveri povezava med Gostitelji TCP / IP. Če pišete novo aplikacijo, boste bolje uporabili podporo za surove vtičnice Winsock 2, vgrajeno v Indyna primer.
Upoštevajte pa, da za izvedbe Windows NT in Windows 2000 Raw Sockets veljajo varnostni pregledi in so dostopni samo članom skrbniške skupine. Icmp.dll ponuja funkcionalnost, ki razvijalcem omogoča pisanje internetnih aplikacij za ping v sistemih Windows brez podpore Winsock 2.
Upoštevajte, da je treba pred uporabo funkcij, ki jih je izpostavil ICMP.DLL, poklicati funkcijo Winsock 1.1 WSAStartup. Če tega ne storite, prvi klic na IcmpSendEcho ne uspe z napako 10091 (WSASYSNOTREADY).
Spodaj najdete izvorno kodo enote Ping. Tu sta dva primera uporabe.
Primer 1: delček kode
uporablja Ping; ...
konst ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
začetek Ping. Ping (ADP_IP) torej ShowMessage ("O doseganju programiranja Delphi!");
konec;
Primer 2: Program Delphi v načinu konzole
Naslednji primer je konzola Program Delphi ki uporablja enoto Ping: Tukaj je vir enote Ping:
enota Ping;
vmesniki
Windows, SysUtils, Razredi;
tip
TSunB = zapakirano ploščo
s_b1, s_b2, s_b3, s_b4: bajt;
konec;
TSunW = zapakirano ploščo
s_w1, s_w2: beseda;
konec;
PIPAddr = ^ TIPAddr;
TIPAddr = zapis
Ovitek celo število od
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: dolga beseda);
konec; IPAddr = TIPAddr;
funkcijo IcmpCreateFile: THandle; stdcall; zunanji 'icmp.dll';
funkcijo IcmpCloseHandle (icmpHandle: THandle): boolean;
stdcall; zunanji 'icmp.dll'
funkcijo IcmpSendEcho
(IcmpHandle: THandle; Naslov destinacije: IPAddr;
RequestData: kazalec; RequestSize: Smallint;
RequestOptions: kazalec;
OdgovoriPogovor: kazalec;
Odgovorna velikost: DWORD;
Čas: DWORD): DWORD; stdcall; zunanji 'icmp.dll';
funkcijo Ping (InetAddress: vrvica): boolean;
izvedbene uporabe
WinSock;
funkcijo Pridobi (var Vhod: vrvica;
konst ADelim: vrvica = ' ';
konst ADelete: Boolean = resnično)
: vrvica;
var
iPos: Integer;
začeti
če ADelim = # 0 nato pa začnite
// AnsiPos ne deluje z # 0
iPos: = Pos (ADelim, AInput);
konec drugega se začne
iPos: = Pos (ADelim, AInput);
konec;
če iPos = 0 nato pa začnite
Rezultat: = AInput;
če ADelete nato pa začnite
AInput: = '';
konec;
konec drugega se začne
rezultat: = Kopiraj (AInput, 1, iPos - 1);
če ADelete nato pa začnite
Izbriši (AInput, 1, iPos + dolžina (ADelim) - 1);
konec;
konec;
konec;
postopek TranslateStringToTInAddr (AIP: vrvica; var AInAddr);
var
ph: PHostEnt; pac: PChar; GInitData: TWSAData;
začeti
WSAStartup (101 USD, GInitData);
poskusi
phe: = GetHostByName (PChar (AIP));
če Dodeljeno (fe) potem začet
pac: = phe ^ .h_addr_list ^;
če Dodeljeno (pac) torej
začeti
s TIPAddr (AInAddr) .S_un_b začeti
s_b1: = bajt (pac [0]); s_b2: = bajt (pac [1]); s_b3: = bajt (pac [2]); s_b4: = bajt (pac [3]);
konec;
konec
drugače
začeti
dvigniti Izjema. Ustvari ('Napaka pri pridobivanju IP iz HostName');
konec;
konec
drugače
začeti
dvigniti Izjema. Ustvari ('Napaka pri pridobivanju HostName');
konec;
razen
FillChar (AInAddr, SizeOf (AInAddr), # 0);
konec; WSACleanup;
konec;
funkcijo Ping (InetAddress: vrvica): boolean;
var
Ročaj: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: matrika[1..128] od bajta;
začeti
rezultat: = napačno; Ročaj: = IcmpCreateFile;
če Ročaj = INVALID_HANDLE_VALUE torej
Izhod;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Ročaj, InAddr, nič, 0, nič, @rep, 128, 0); Rezultat: = (DW 0); IcmpCloseHandle (Ročaj);
konec;
konec.