Implementarea PING Fără folosirea soclurilor brute

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.

Ce este un ping?

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.

Exemplul 1: fragment de cod

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
;

Exemplu 2: Modul Console Program Delphi

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
.