Toteutetaan PING käyttämättä raa'ita pistorasioita

click fraud protection

Windows tukee ICMP (Internet Control Message Protocol) -protokollaa sen määrittämiseksi, onko tietty isäntä käytettävissä. ICMP on verkkokerrosprotokolla, joka välittää virtauksen ohjausta, virheilmoituksia, reititystä ja muuta dataa Internet-isäntien välillä. Sovelluskehittäjät käyttävät ICMP: tä ensisijaisesti verkko pingille.

Mikä on ping?

Ping on prosessi, jossa kaikuviesti lähetetään IP-osoitteeseen ja luetaan vastaus varmistaakseen yhteyden välillä TCP / IP-isännät. Jos kirjoitat uutta sovellusta, on parempi käyttää Winsock 2 -raaka-pistorasioiden tukea, joka on otettu käyttöön vuonna 2006 indy, esimerkiksi.

Huomaa kuitenkin, että Windows NT- ja Windows 2000 -käyttöjärjestelmissä Raw-pistorasioille suoritetaan tietoturvatarkastukset ja että ne ovat vain järjestelmänvalvojan ryhmän jäsenten käytettävissä. Icmp.dll tarjoaa toiminnallisuuden, jonka avulla kehittäjät voivat kirjoittaa Internet-ping-sovelluksia Windows-järjestelmiin ilman Winsock 2 -tukea.

Huomaa, että Winsock 1.1 WSAStartup -toiminto on kutsuttava ennen ICMP.DLL: n paljastamien toimintojen käyttöä. Jos et tee tätä, ensimmäinen puhelu IcmpSendEcholle epäonnistuu virheellä 10091 (WSASYSNOTREADY).

instagram viewer

Alta löydät Ping-yksikön lähdekoodin. Tässä on kaksi esimerkkiä käytöstä.

Esimerkki 1: Koodinpätkä

käyttötarkoitukset Ping; ...
const
ADP_IP = '208,185,127,40'; (* http://delphi.about.com *)
beginIf
Ping. Ping (ADP_IP) sitten ShowMessage ('Tietoja Delphi-ohjelmoinnista saavutettavissa!');
pää
;

Esimerkki 2: Konsolitilan Delphi-ohjelma

Seuraava esimerkki on konsolitila Delphi-ohjelma joka käyttää ping-yksikköä:. Tässä on Ping-yksikön lähde:

yksikkö ping;
interfaceuses

Windows, SysUtils, luokat;
tyyppi

TSunB = pakattu levy
s_b1, s_b2, s_b3, s_b4: tavu;
pää
;
TSunW = pakattu levy
s_w1, s_w2: sana;
pää
;
PIPAddr = ^ TIPAddr;
TIPAddr = ennätys
tapaus
kokonaisluku of
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: pitkäsana);
pää
; IPAddr = TIPAddr;
toimia
IcmpCreateFile: Thandle; stdcall; ulkoinen 'Icmp.dll';
toimia
IcmpCloseHandle (icmpHandle: THandle): boolean;
stdcall
; ulkoinen 'Icmp.dll'
toimia
IcmpSendEcho
(IcmpHandle: THandle; Kohdeosoite: IPAddr;
RequestData: Osoitin; RequestSize: Smallint;
RequestOptions: osoitin;
ReplyBuffer: Osoitin;
Vastauskoko: DWORD;
Aikakatkaisu: DWORD): DWORD; stdcall; ulkoinen 'Icmp.dll';
toimia
Ping (InetAddress: jono): boolean;
implementationuses

WinSock;
toimia
nouto (var AInput: jono;
const
ADelim: jono = ' ';
const
ADelete: looginen = tosi)
: jono;
var

iPos: kokonaisluku;
alkaa
jos
ADelim = # 0 aloita sitten
// AnsiPos ei toimi # 0: n kanssa

iPos: = Pos (ADelim, AInput);
loppu lopussa alkaa

iPos: = Pos (ADelim, AInput);
pää
;
jos
iPos = 0 aloita sitten
Tulos: = AInput;
jos
ADelete aloita sitten
AInput: = '';
pää
;
loppu lopussa alkaa

tulos: = Kopioi (AInput, 1, iPos - 1);
jos
ADelete aloita sitten
Poista (AInput, 1, iPos + Length (ADelim) - 1);
pää
;
pää
;
pää
;
menettely
TranslateStringToTInAddr (AIP: jono; var AInAddr);
var

phe: PHostEnt; pac: PChar; GInitData: TWSAData;
alkaa

WSAStartup ($ 101, GInitData);
yrittää

phe: = GetHostByName (PChar (AIP));
jos
Määrätty (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
jos
Annettu (pak) sitten
alkaa
kanssa
TIPAddr (AInAddr) .S_un_b aloitetaan
s_b1: = Tavu (pac [0]); s_b2: = Tavu (pac [1]); s_b3: = Tavu (pac [2]); s_b4: = Tavu (pac [3]);
pää
;
pää
muu
alkaa
nostaa
Poikkeus. Luo ('Virhe IP: n saamisessa isäntänimestä');
pää
;
pää
muu
alkaa
nostaa
Poikkeus. Luo ('Virhe isäntänimen saamisessa');
pää
;
paitsi

FillChar (AInAddr, SizeOf (AInAddr), # 0);
pää
; WSACleanup;
pää
;
toimia
Ping (InetAddress: jono): boolean;
var

Kahva: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: ryhmä[1..128] of tavu;
alkaa

tulos: = väärä; Kahva: = IcmpCreateFile;
jos
Kahva = INVALID_HANDLE_VALUE sitten
exit;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Kahva, InAddr, nolla, 0, nolla, @rep, 128, 0); Tulos: = (DW0); IcmpCloseHandle (kahva);
pää
;​
pää
.
instagram story viewer