Windows podržava protokol poruka o internetskoj kontroli (ICMP) kako bi utvrdio je li određeni domaćin dostupan ili ne. ICMP je protokol mrežnog sloja koji pruža internetsku kontrolu protoka, poruke o pogrešci, usmjeravanje i druge podatke. ICMP primarno koriste programeri za mrežni ping.
Što je ping?
Ping je proces slanja eho poruke na IP adresu i čitanja odgovora kako bi se potvrdila veza između TCP / IP domaćini. Ako pišete novu aplikaciju, bit će vam bolje koristiti podršku za Winsock 2 sirove utičnice, implementiranu u sustavu Windows Indy, na primjer.
No imajte na umu da su za implementacije Windows NT i Windows 2000 Raw Sockets podložne sigurnosnim provjerama i da su dostupne samo članovima administratorske grupe. Icmp.dll pruža funkcionalnost koja programerima omogućuje pisanje internetskih ping aplikacija na Windows sustavima bez podrške Winsock 2.
Imajte na umu da se funkcija Winsock 1.1 WSAStartup mora pozvati prije upotrebe funkcija koje je izložio ICMP.DLL. Ako to ne učinite, prvi poziv na IcmpSendEcho neće uspjeti s pogreškom 10091 (WSASYSNOTREADY).
Ispod možete pronaći izvorni kod Ping jedinice. Evo dva primjera upotrebe.
Primjer 1: Isječak koda
namjene Ping; ...
const ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginIf Ping. Ping (ADP_IP) zatim ShowMessage ("O dometi Delphi programiranja!");
kraj;
Primjer 2: Delphi program za način rada konzole
Naš sljedeći primjer je način rada konzole Delphi program koja koristi jedinicu Ping:. Evo izvora Ping jedinice:
jedinica Ping;
interfaceuses
Windows, SysUtils, klase;
tip
TSunB = upakirana ploča
s_b1, s_b2, s_b3, s_b4: bajt;
kraj;
TSunW = upakirana ploča
s_w1, s_w2: riječ;
kraj;
PIPAddr = ^ TIPAddr;
TIPAddr = snimiti
slučaj broj od
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: duga riječ);
kraj; IPAddr = TIPAddr;
funkcija IcmpCreateFile: THandle; stdcall; vanjski 'Icmp.dll';
funkcija IcmpCloseHandle (icmpHandle: THandle): boolean;
stdcall; vanjski 'Icmp.dll'
funkcija IcmpSendEcho
(IcmpHandle: THandle; Odredišna adresa: IPAddr;
RequestData: Pointer; RequestSize: Smallint;
RequestOptions: pointer;
OdgovorBuffer: Pointer;
ReplySize: DWORD;
Istek vremena: DWORD): DWORD; stdcall; vanjski 'Icmp.dll';
funkcija Ping (InetAddress: niz): boolean;
implementationuses
WinSock;
funkcija Fetch (var AInput: niz;
const ADelim: niz = ' ';
const ADelete: Boolean = istina)
: niz;
var
iPos: Integer;
početi
ako ADelim = # 0 onda započnite
// AnsiPos ne radi s brojem 0
iPos: = Pos (ADelim, AInput);
kraj drugog početi
iPos: = Pos (ADelim, AInput);
kraj;
ako iPos = 0 onda započnite
Rezultat: = AInput;
ako ADelete onda započnite
AInput: = '';
kraj;
kraj drugog početi
rezultat: = Kopiraj (AInput, 1, iPos - 1);
ako ADelete onda započnite
Izbriši (AInput, 1, iPos + dužina (ADelim) - 1);
kraj;
kraj;
kraj;
postupak TranslateStringToTInAddr (AIP: niz; var AInAddr);
var
ph: PHostEnt; pac: PChar; GInitData: TWSAData;
početi
WSAStartup (101 USD, GInitData);
probati
phe: = GetHostByName (PChar (AIP));
ako Dodijeljeno (pe) thenbegin
pac: = phe ^ .h_addr_list ^;
ako Dodijeljeno (pac) zatim
početi
s TIPAddr (AInAddr) .S_un_b započeti
s_b1: = bajt (pac [0]); s_b2: = bajt (pac [1]); s_b3: = bajt (pac [2]); s_b4: = bajt (pac [3]);
kraj;
kraj
drugo
početi
podići Iznimka. Kreiraj ('Pogreška pri dobivanju IP-a od HostName');
kraj;
kraj
drugo
početi
podići Iznimka. Kreiraj ('Pogreška pri dobivanju HostName');
kraj;
osim
FillChar (AInAddr, SizeOf (AInAddr), # 0);
kraj-WSACleanup;
kraj;
funkcija Ping (InetAddress: niz): boolean;
var
Ručka: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: red[1..128] od bajt;
početi
rezultat: = lažno; Ručka: = IcmpCreateFile;
ako Ručka = INVALID_HANDLE_VALUE zatim
Izlaz;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Ručka, InAddr, nula, 0, nula, @rep, 128, 0); Rezultat: = (DW 0); IcmpCloseHandle (Ručka);
kraj;
kraj.