Izvajanje PING-a brez uporabe surovih vtičnic

Windows podpira protokol za nadzor internetnega nadzora (ICMP), da ugotovi, ali je določen gostitelj na voljo ali ne. ICMP je protokol omrežnega sloja, ki med internetnimi gostitelji zagotavlja nadzor pretoka, sporočila o napakah, usmerjanje in druge podatke. ICMP uporabljajo predvsem razvijalci aplikacij za omrežni ping.

Kaj je ping?

Ping je postopek pošiljanja odmeva na naslov IP in branje odgovora, da se preveri povezava med Gostitelji TCP / IP. Če pišete novo aplikacijo, boste bolje uporabili podporo za surove vtičnice Winsock 2, vgrajeno v Indyna primer.

Upoštevajte pa, da za izvedbe Windows NT in Windows 2000 Raw Sockets veljajo varnostni pregledi in so dostopni samo članom skrbniške skupine. Icmp.dll ponuja funkcionalnost, ki razvijalcem omogoča pisanje internetnih aplikacij za ping v sistemih Windows brez podpore Winsock 2.

Upoštevajte, da je treba pred uporabo funkcij, ki jih je izpostavil ICMP.DLL, poklicati funkcijo Winsock 1.1 WSAStartup. Če tega ne storite, prvi klic na IcmpSendEcho ne uspe z napako 10091 (WSASYSNOTREADY).

instagram viewer

Spodaj najdete izvorno kodo enote Ping. Tu sta dva primera uporabe.

Primer 1: delček kode

uporablja Ping; ...
konst
ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
začetek
Ping. Ping (ADP_IP) torej ShowMessage ("O doseganju programiranja Delphi!");
konec
;

Primer 2: Program Delphi v načinu konzole

Naslednji primer je konzola Program Delphi ki uporablja enoto Ping: Tukaj je vir enote Ping:

enota Ping;
vmesniki

Windows, SysUtils, Razredi;
tip

TSunB = zapakirano ploščo
s_b1, s_b2, s_b3, s_b4: bajt;
konec
;
TSunW = zapakirano ploščo
s_w1, s_w2: beseda;
konec
;
PIPAddr = ^ TIPAddr;
TIPAddr = zapis
Ovitek
celo število od
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: dolga beseda);
konec
; IPAddr = TIPAddr;
funkcijo
IcmpCreateFile: THandle; stdcall; zunanji 'icmp.dll';
funkcijo
IcmpCloseHandle (icmpHandle: THandle): boolean;
stdcall
; zunanji 'icmp.dll'
funkcijo
IcmpSendEcho
(IcmpHandle: THandle; Naslov destinacije: IPAddr;
RequestData: kazalec; RequestSize: Smallint;
RequestOptions: kazalec;
OdgovoriPogovor: kazalec;
Odgovorna velikost: DWORD;
Čas: DWORD): DWORD; stdcall; zunanji 'icmp.dll';
funkcijo
Ping (InetAddress: vrvica): boolean;
izvedbene uporabe

WinSock;
funkcijo
Pridobi (var Vhod: vrvica;
konst
ADelim: vrvica = ' ';
konst
ADelete: Boolean = resnično)
: vrvica;
var

iPos: Integer;
začeti
če
ADelim = # 0 nato pa začnite
// AnsiPos ne deluje z # 0

iPos: = Pos (ADelim, AInput);
konec drugega se začne

iPos: = Pos (ADelim, AInput);
konec
;
če
iPos = 0 nato pa začnite
Rezultat: = AInput;
če
ADelete nato pa začnite
AInput: = '';
konec
;
konec drugega se začne

rezultat: = Kopiraj (AInput, 1, iPos - 1);
če
ADelete nato pa začnite
Izbriši (AInput, 1, iPos + dolžina (ADelim) - 1);
konec
;
konec
;
konec
;
postopek
TranslateStringToTInAddr (AIP: vrvica; var AInAddr);
var

ph: PHostEnt; pac: PChar; GInitData: TWSAData;
začeti

WSAStartup (101 USD, GInitData);
poskusi

phe: = GetHostByName (PChar (AIP));
če
Dodeljeno (fe) potem začet
pac: = phe ^ .h_addr_list ^;
če
Dodeljeno (pac) torej
začeti
s
TIPAddr (AInAddr) .S_un_b začeti
s_b1: = bajt (pac [0]); s_b2: = bajt (pac [1]); s_b3: = bajt (pac [2]); s_b4: = bajt (pac [3]);
konec
;
konec
drugače
začeti
dvigniti
Izjema. Ustvari ('Napaka pri pridobivanju IP iz HostName');
konec
;
konec
drugače
začeti
dvigniti
Izjema. Ustvari ('Napaka pri pridobivanju HostName');
konec
;
razen

FillChar (AInAddr, SizeOf (AInAddr), # 0);
konec
; WSACleanup;
konec
;
funkcijo
Ping (InetAddress: vrvica): boolean;
var

Ročaj: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: matrika[1..128] od bajta;
začeti

rezultat: = napačno; Ročaj: = IcmpCreateFile;
če
Ročaj = INVALID_HANDLE_VALUE torej
Izhod;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Ročaj, InAddr, nič, 0, nič, @rep, 128, 0); Rezultat: = (DW 0); IcmpCloseHandle (Ročaj);
konec
;​
konec
.
instagram story viewer