Implementácia protokolu PING bez použitia surových zásuviek

windows podporuje protokol ICMP (Internet Control Message Protocol) na určenie, či je konkrétny hostiteľ k dispozícii. ICMP je protokol sieťovej vrstvy, ktorý poskytuje riadenie toku, chybové správy, smerovanie a ďalšie údaje medzi internetovými hostiteľmi. ICMP primárne používajú vývojári aplikácií pre sieťový ping.

Čo je to Ping?

Ping je proces odoslania echo správy na IP adresu a prečítanie odpovede na overenie spojenia medzi Hostitelia TCP / IP. Ak píšete novú aplikáciu, budete lepšie používať podporu surových soketov Winsock 2 implementovanú v systéme Windows Indy, napríklad.

Upozorňujeme však, že v prípade implementácií Windows NT a Windows 2000 sú Raw Sockets predmetom bezpečnostných kontrol a sú prístupné iba členom skupiny správcov. Icmp.dll poskytuje funkcie, ktoré umožňujú vývojárom písať internetové pingové aplikácie v systémoch Windows bez podpory Winsock 2.

Všimnite si, že funkcia Winsock 1.1 WSAStartup musí byť volaná pred použitím funkcií vystavených ICMP.DLL. Ak to neurobíte, prvé volanie na IcmpSendEcho zlyhá s chybou 10091 (WSASYSNOTREADY).

instagram viewer

Nižšie nájdete zdrojový kód jednotky Ping. Tu sú dva príklady použitia.

Príklad 1: Útržok kódu

použitie Ping; ...
const
ADP_IP = '208,188,27,40'; (* http://delphi.about.com *)
beginIf
Ping. Ping (ADP_IP) potom ShowMessage („O programoch Delphi dosiahnuteľných!“);
koniec
;

Príklad 2: Program konzoly v režime Delphi

Našim ďalším príkladom je režim konzoly Program Delphi, ktorý používa jednotku Ping:. Tu je zdroj jednotky Ping:

jednotka ping;
interfaceuses

Okná, SysUtils, triedy;
typ

TSunB = zabalený záznam
s_b1, s_b2, s_b3, s_b4: byte;
koniec
;
TSunW = zabalený záznam
s_w1, s_w2: slovo;
koniec
;
PIPAddr = ^ TIPAddr;
TIPAddr = rekord
púzdro
celé číslo z
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword);
koniec
; IPAddr = TIPAddr;
funkcie
IcmpCreateFile: THandle; stdcall; externý 'Icmp.dll';
funkcie
IcmpCloseHandle (icmpHandle: THandle): boolean;
stdcall
; externý 'Icmp.dll'
funkcie
IcmpSendEcho
(IcmpHandle: THandle; Cieľová adresa: IPAddr;
RequestData: Ukazovateľ; RequestSize: Smallint;
RequestOptions: ukazovateľ;
ReplyBuffer: Ukazovateľ;
AnswerSize: DWORD;
Časový limit: DWORD): DWORD; stdcall; externý 'Icmp.dll';
funkcie
Ping (InetAddress: povrázok): boolean;
implementationuses

WinSock;
funkcie
načítanie (var AInput: povrázok;
const
Adelie: povrázok = ' ';
const
ADelete: Boolean = true)
: povrázok;
var

iPos: Celé číslo;
začať
ak
ADelim = # 0 potom začnite
// AnsiPos nefunguje s # 0

iPos: = Pos (ADelim, AInput);
koniec inde začína

iPos: = Pos (ADelim, AInput);
koniec
;
ak
iPos = 0 potom začnite
Výsledok: = vstup;
ak
Adele potom začnite
AInput: = '';
koniec
;
koniec inde začína

výsledok: = kópia (vstup, 1, iPos - 1);
ak
Adele potom začnite
Odstrániť (AInput, 1, iPos + Dĺžka (ADelim) - 1);
koniec
;
koniec
;
koniec
;
procedúra
TranslateStringToTInAddr (AIP: povrázok; var AInAddr);
var

phe: PHostEnt; pac: PChar; GInitData: TWSAData;
začať

WSASartup (101 dolárov, GInitData);
vyskúšať

phe: = GetHostByName (PChar (AIP));
ak
Priradené (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
ak
Priradené (pac) potom
začať
s
TIPAddr (AInAddr) .S_un_b začínam
s_b1: = byte (pac [0]); s_b2: = byte (pac [1]); s_b3: = byte (pac [2]); s_b4: = byte (pac [3]);
koniec
;
koniec
inak
začať
raise
Výnimka. Vytvoriť („Chyba pri získavaní adresy IP z názvu hostiteľa“);
koniec
;
koniec
inak
začať
raise
Výnimka. Create ('Chyba pri získaní HostName');
koniec
;
leč

FillChar (AInAddr, SizeOf (AInAddr), # 0);
koniec
; WSACleanup;
koniec
;
funkcie
Ping (InetAddress: povrázok): boolean;
var

Rukoväť: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: rad[1..128] z byte;
začať

výsledok: = false; Handle: = IcmpCreateFile;
ak
Rukoväť = INVALID_HANDLE_VALUE potom
Východ;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Handle, InAddr, nula, 0, nula, @rep, 128, 0; Výsledok: = (DWO); IcmpCloseHandle (Handle);
koniec
;​
koniec
.