Windows acceptă un protocol de control Internet (ICMP) pentru a determina dacă o anumită gazdă este sau nu disponibilă. ICMP este un protocol de nivel de rețea care furnizează controlul fluxului, mesaje de eroare, rutare și alte date între gazdele de internet. ICMP este utilizat în principal de dezvoltatorii de aplicații pentru un ping de rețea.
Un ping este procesul de trimitere a unui mesaj ecou la o adresă IP și citirea răspunsului pentru a verifica o conexiune între gazdele TCP / IP. Dacă scrieți o aplicație nouă, va fi mai bine să utilizați suportul Winsock 2 pentru socluri brute, implementat în Indy, de exemplu.
Rețineți, totuși, că pentru implementările Windows NT și Windows 2000, soclurile Raw sunt supuse verificărilor de securitate și sunt accesibile numai membrilor grupului de administrator. Icmp.dll oferă funcționalitate care permite dezvoltatorilor să scrie aplicații de ping pe Internet pe sistemele Windows fără suportul Winsock 2.
Rețineți că funcția Winsock 1.1 WSAStartup trebuie apelată înainte de a utiliza funcțiile expuse de ICMP.DLL. Dacă nu faceți acest lucru, primul apel către IcmpSendEcho va eșua cu eroarea 10091 (WSASYSNOTREADY).
Mai jos puteți găsi codul sursă al unității Ping. Iată două exemple de utilizare.
utilizări Ping; ...
const ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginIf Ping.Ping (ADP_IP) apoi ShowMessage („Despre programarea Delphi accesibilă!”);
Sfârșit;
Următorul nostru exemplu este un program Delphi în modul de consolă care folosește unitatea Ping:. Iată sursa unității Ping:
unitate Ping;
interfaceuses
Windows, SysUtils, clase;
tip
TSunB = înregistrare la pachet
s_b1, s_b2, s_b3, s_b4: byte;
Sfârșit;
TSunW = înregistrare la pachet
s_w1, s_w2: cuvânt;
Sfârșit;
PIPAddr = ^ TIPAddr;
TIPAddr = record
caz întreg de
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: cuvânt lung);
Sfârșit; IPAddr = TIPAddr;
funcţie IcmpCreateFile: Thandle; stdcall; extern 'ICMP.DLL';
funcţie IcmpCloseHandle (icmpHandle: Thandle): boolean;
stdcall; extern 'ICMP.DLL'
funcţie IcmpSendEcho
(IcmpHandle: Thandle; DestinationAddress: IPAddr;
RequestData: Pointer; RequestSize: Smallint;
RequestOptions: pointer;
ReplyBuffer: Pointer;
ReplySize: DWORD;
Timeout: DWORD): DWORD; stdcall; extern 'ICMP.DLL';
funcţie Ping (InetAddress: şir): boolean;
implementationuses
WinSock;
funcţie Preluați (var AInput: şir;
const ADelim: şir = ";
const ADelete: Boolean = true)
: şir;
var
iPos: Integer;
începe
dacă ADelim = # 0 apoi începe
// AnsiPos nu funcționează cu numărul 0
iPos: = Pos (ADelim, AInput);
sfârșitul începe altceva
iPos: = Pos (ADelim, AInput);
Sfârșit;
dacă iPos = 0 apoi începe
Rezultat: = AInput;
dacă ADelete apoi începe
AInput: = ";
Sfârșit;
sfârșitul începe altceva
rezultat: = Copiere (AInput, 1, iPos - 1);
dacă ADelete apoi începe
Ștergeți (AInput, 1, iPos + Length (ADelim) - 1);
Sfârșit;
Sfârșit;
Sfârșit;
procedură TranslateStringToTInAddr (AIP: şir; var AInAddr);
var
phe: PHostEnt; pac: PChar; GInitData: TWSAData;
începe
WSAStartup (101 USD, GInitData);
încerca
phe: = GetHostByName (PChar (AIP));
dacă Atribuit (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
dacă Atribuit (PAC) apoi
începe
cu TIPAddr (AInAddr) .S_un_b începe
s_b1: = Byte (pac [0]); s_b2: = Byte (pac [1]); s_b3: = Byte (pac [2]); s_b4: = Byte (pac [3]);
Sfârșit;
Sfârșit
altfel
începe
a ridica Exception.Create ('Eroare la preluarea IP de la HostName');
Sfârșit;
Sfârșit
altfel
începe
a ridica Exception.Create ('Eroare la obținerea numelui de gazdă');
Sfârșit;
cu exceptia
FillChar (AInAddr, SizeOf (AInAddr), # 0);
Sfârșit; WSACleanup;
Sfârșit;
funcţie Ping (InetAddress: şir): boolean;
var
Mâner: Mândră;
InAddr: IPAddr;
DW: DWORD;
reprezentant : mulțime[1 ... 128] de octet;
începe
rezultat: = fals; Handle: = IcmpCreateFile;
dacă Mâner = INVALID_HANDLE_VALUE apoi
Ieșire;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Handle, InAddr, zero, 0, zero, @rep, 128, 0); Rezultat: = (DW 0); IcmpCloseHandle (mâner);
Sfârșit;
Sfârșit.