PINGi rakendamine ilma toores pistikupesasid kasutamata

Windows toetab Interneti-kontrollsõnumi protokolli (ICMP), et teha kindlaks, kas konkreetne host on saadaval või mitte. ICMP on võrgukihi protokoll, mis edastab voo juhtimist, tõrketeateid, marsruutimist ja muud teavet Interneti-hostide vahel. ICMP-d kasutavad võrgu arendamiseks peamiselt rakenduste arendajad.

Mis on ping?

Ping on kajasõnumi saatmine IP-aadressile ja vastuse lugemine, et kontrollida omavahelist ühendust TCP / IP-hostid. Uue rakenduse kirjutamisel on parem kasutada Winsock 2 toores pistikupesade tuge, mis on installitud Indy, näiteks.

Pange siiski tähele, et Windows NT ja Windows 2000 rakenduste puhul kehtivad toores pistikupesad turvakontrollile ja neile pääsevad ligi ainult administraatori rühma liikmed. Icmp.dll pakub funktsionaalsust, mis võimaldab arendajatel kirjutada Interneti-pingi rakendusi Windowsi süsteemidesse ilma Winsock 2 toeta.

Pange tähele, et enne ICMP.DLL-ga paljastatud funktsioonide kasutamist tuleb kutsuda Winsock 1.1 WSAStartup-funktsioon. Kui te seda ei tee, ebaõnnestub IcmpSendEcho esimene kõne tõrkega 10091 (WSASYSNOTREADY).

instagram viewer

Altpoolt leiate Pingi üksuse lähtekoodi. Siin on kaks kasutamise näidet.

Näide 1: koodilõik

kasutab Ping; ...
const
ADP_IP = '208,185,127,40'; (* http://delphi.about.com *)
algabKui
Ping. Ping (ADP_IP) siis ShowMessage ('Teave Delphi programmeerimise kohta on kättesaadav!');
lõpp
;

Näide 2: Konsoolirežiimi Delphi programm

Meie järgmine näide on konsoolirežiim Delphi programm mis kasutab pingikomplekti:. Siin on Pingi üksuse allikas:

ühik Ping;
liidesed

Windows, SysUtils, Classes;
tüüp

TSunB = pakitud rekord
s_b1, s_b2, s_b3, s_b4: bait;
lõpp
;
TSunW = pakitud rekord
s_w1, s_w2: sõna;
lõpp
;
PIPAddr = ^ TIPAddr;
TIPAddr = rekord
juhtum
täisarv of
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: pikk sõna);
lõpp
IPAddr = TIPAddr;
funktsiooni
IcmpCreateFile: Thandle; stdcall; väline 'icmp.dll';
funktsiooni
IcmpCloseHandle (icmpHandle: THandle): loogiline;
stdcall
; väline 'icmp.dll'
funktsiooni
IcmpSendEcho
(IcmpHandle: Thandle; Sihtkoha aadress: IPAddr;
RequestData: Pointer; RequestSize: Smallint;
RequestOptions: osuti;
ReplyBuffer: Pointer;
VastaSuurus: DWORD;
Aegumine: DWORD): DWORD; stdcall; väline 'icmp.dll';
funktsiooni
Ping (InetAddress: nöör): loogiline;
rakendused

WinSock;
funktsiooni
Too (var Sisend: nöör;
const
ADelim: nöör = ' ';
const
ADvali: tõeväärtus = tõsi)
: nöör;
var

iPod: täisarv;
alustada
kui
ADelim = # 0 siis alusta
// AnsiPos ei tööta numbriga 0

iPod: = Pos (ADelim, AInput);
lõpp muidu algab

iPod: = Pos (ADelim, AInput);
lõpp
;
kui
iPos = 0 siis alusta
Tulemus: = sisend;
kui
ADvali siis alusta
AInput: = '';
lõpp
;
lõpp muidu algab

tulemus: = kopeerimine (AInput, 1, iPos - 1);
kui
ADvali siis alusta
Kustuta (AInput, 1, iPos + pikkus (ADelim) - 1);
lõpp
;
lõpp
;
lõpp
;
protseduur
TranslateStringToTInAddr (AIP: nöör; var AInAddr);
var

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

WSAStartup (101 dollarit, GInitData);
proovida

phe: = GetHostByName (PChar (AIP));
kui
Määratud (phe) siis alustatakse
pac: = phe ^ .h_addr_list ^;
kui
Määratud (pakk) siis
alustada
koos
TIPAddr (AInAddr) .S_un_b alustage
s_b1: = bait (pac [0]); s_b2: = bait (pac [1]); s_b3: = bait (pac [2]); s_b4: = bait (pac [3]);
lõpp
;
lõpp
muud
alustada
tõsta
Erand. Loo ('Viga hostinimest IP saamisel');
lõpp
;
lõpp
muud
alustada
tõsta
Erand. Loo ('Viga HostName hankimisel');
lõpp
;
välja arvatud

FillChar (AInAddr, SizeOf (AInAddr), # 0);
lõpp
; WSACleanup;
lõpp
;
funktsiooni
Ping (InetAddress: nöör): loogiline;
var

Käepide: käepide;
InAddr: IPAddr;
DW: DWORD;
rep: massiiv[1..128] of bait;
alustada

tulemus: = vale; Käepide: = IcmpCreateFile;
kui
Käepide = INVALID_HANDLE_VALUE siis
Väljapääs;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (käepide, InAddr, null, 0, null, @rep, 128, 0); tulemus: = (DW 0); IcmpCloseHandle (käepide);
lõpp
;​
lõpp
.
instagram story viewer