Primjena PING-a bez upotrebe sirovih utičnica

click fraud protection

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).

instagram viewer

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
.
instagram story viewer