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