Windows toetab Interneti-kontrollsõnumi protokolli (ICMP), et teha kindlaks, kas konkreetne host on saadaval või mitte. ICMP on võrgukihi protokoll, mis edastab voo juhtimist, tõrketeateid, marsruutimist ja muud teavet Interneti-hostide vahel. ICMP-d kasutavad võrgu arendamiseks peamiselt rakenduste arendajad.
Mis on ping?
Ping on kajasõnumi saatmine IP-aadressile ja vastuse lugemine, et kontrollida omavahelist ühendust TCP / IP-hostid. Uue rakenduse kirjutamisel on parem kasutada Winsock 2 toores pistikupesade tuge, mis on installitud Indy, näiteks.
Pange siiski tähele, et Windows NT ja Windows 2000 rakenduste puhul kehtivad toores pistikupesad turvakontrollile ja neile pääsevad ligi ainult administraatori rühma liikmed. Icmp.dll pakub funktsionaalsust, mis võimaldab arendajatel kirjutada Interneti-pingi rakendusi Windowsi süsteemidesse ilma Winsock 2 toeta.
Pange tähele, et enne ICMP.DLL-ga paljastatud funktsioonide kasutamist tuleb kutsuda Winsock 1.1 WSAStartup-funktsioon. Kui te seda ei tee, ebaõnnestub IcmpSendEcho esimene kõne tõrkega 10091 (WSASYSNOTREADY).
Altpoolt leiate Pingi üksuse lähtekoodi. Siin on kaks kasutamise näidet.
Näide 1: koodilõik
kasutab Ping; ...
const ADP_IP = '208,185,127,40'; (* http://delphi.about.com *)
algabKui Ping. Ping (ADP_IP) siis ShowMessage ('Teave Delphi programmeerimise kohta on kättesaadav!');
lõpp;
Näide 2: Konsoolirežiimi Delphi programm
Meie järgmine näide on konsoolirežiim Delphi programm mis kasutab pingikomplekti:. Siin on Pingi üksuse allikas:
ühik Ping;
liidesed
Windows, SysUtils, Classes;
tüüp
TSunB = pakitud rekord
s_b1, s_b2, s_b3, s_b4: bait;
lõpp;
TSunW = pakitud rekord
s_w1, s_w2: sõna;
lõpp;
PIPAddr = ^ TIPAddr;
TIPAddr = rekord
juhtum täisarv of
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: pikk sõna);
lõppIPAddr = TIPAddr;
funktsiooni IcmpCreateFile: Thandle; stdcall; väline 'icmp.dll';
funktsiooni IcmpCloseHandle (icmpHandle: THandle): loogiline;
stdcall; väline 'icmp.dll'
funktsiooni IcmpSendEcho
(IcmpHandle: Thandle; Sihtkoha aadress: IPAddr;
RequestData: Pointer; RequestSize: Smallint;
RequestOptions: osuti;
ReplyBuffer: Pointer;
VastaSuurus: DWORD;
Aegumine: DWORD): DWORD; stdcall; väline 'icmp.dll';
funktsiooni Ping (InetAddress: nöör): loogiline;
rakendused
WinSock;
funktsiooni Too (var Sisend: nöör;
const ADelim: nöör = ' ';
const ADvali: tõeväärtus = tõsi)
: nöör;
var
iPod: täisarv;
alustada
kui ADelim = # 0 siis alusta
// AnsiPos ei tööta numbriga 0
iPod: = Pos (ADelim, AInput);
lõpp muidu algab
iPod: = Pos (ADelim, AInput);
lõpp;
kui iPos = 0 siis alusta
Tulemus: = sisend;
kui ADvali siis alusta
AInput: = '';
lõpp;
lõpp muidu algab
tulemus: = kopeerimine (AInput, 1, iPos - 1);
kui ADvali siis alusta
Kustuta (AInput, 1, iPos + pikkus (ADelim) - 1);
lõpp;
lõpp;
lõpp;
protseduur TranslateStringToTInAddr (AIP: nöör; var AInAddr);
var
phe: PHostEnt; pac: PChar; GInitData: TWSAData;
alustada
WSAStartup (101 dollarit, GInitData);
proovida
phe: = GetHostByName (PChar (AIP));
kui Määratud (phe) siis alustatakse
pac: = phe ^ .h_addr_list ^;
kui Määratud (pakk) siis
alustada
koos TIPAddr (AInAddr) .S_un_b alustage
s_b1: = bait (pac [0]); s_b2: = bait (pac [1]); s_b3: = bait (pac [2]); s_b4: = bait (pac [3]);
lõpp;
lõpp
muud
alustada
tõsta Erand. Loo ('Viga hostinimest IP saamisel');
lõpp;
lõpp
muud
alustada
tõsta Erand. Loo ('Viga HostName hankimisel');
lõpp;
välja arvatud
FillChar (AInAddr, SizeOf (AInAddr), # 0);
lõpp; WSACleanup;
lõpp;
funktsiooni Ping (InetAddress: nöör): loogiline;
var
Käepide: käepide;
InAddr: IPAddr;
DW: DWORD;
rep: massiiv[1..128] of bait;
alustada
tulemus: = vale; Käepide: = IcmpCreateFile;
kui Käepide = INVALID_HANDLE_VALUE siis
Väljapääs;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (käepide, InAddr, null, 0, null, @rep, 128, 0); tulemus: = (DW 0); IcmpCloseHandle (käepide);
lõpp;
lõpp.