windows podporuje protokol ICMP (Internet Control Message Protocol) na určenie, či je konkrétny hostiteľ k dispozícii. ICMP je protokol sieťovej vrstvy, ktorý poskytuje riadenie toku, chybové správy, smerovanie a ďalšie údaje medzi internetovými hostiteľmi. ICMP primárne používajú vývojári aplikácií pre sieťový ping.
Čo je to Ping?
Ping je proces odoslania echo správy na IP adresu a prečítanie odpovede na overenie spojenia medzi Hostitelia TCP / IP. Ak píšete novú aplikáciu, budete lepšie používať podporu surových soketov Winsock 2 implementovanú v systéme Windows Indy, napríklad.
Upozorňujeme však, že v prípade implementácií Windows NT a Windows 2000 sú Raw Sockets predmetom bezpečnostných kontrol a sú prístupné iba členom skupiny správcov. Icmp.dll poskytuje funkcie, ktoré umožňujú vývojárom písať internetové pingové aplikácie v systémoch Windows bez podpory Winsock 2.
Všimnite si, že funkcia Winsock 1.1 WSAStartup musí byť volaná pred použitím funkcií vystavených ICMP.DLL. Ak to neurobíte, prvé volanie na IcmpSendEcho zlyhá s chybou 10091 (WSASYSNOTREADY).
Nižšie nájdete zdrojový kód jednotky Ping. Tu sú dva príklady použitia.
Príklad 1: Útržok kódu
použitie Ping; ...
const ADP_IP = '208,188,27,40'; (* http://delphi.about.com *)
beginIf Ping. Ping (ADP_IP) potom ShowMessage („O programoch Delphi dosiahnuteľných!“);
koniec;
Príklad 2: Program konzoly v režime Delphi
Našim ďalším príkladom je režim konzoly Program Delphi, ktorý používa jednotku Ping:. Tu je zdroj jednotky Ping:
jednotka ping;
interfaceuses
Okná, SysUtils, triedy;
typ
TSunB = zabalený záznam
s_b1, s_b2, s_b3, s_b4: byte;
koniec;
TSunW = zabalený záznam
s_w1, s_w2: slovo;
koniec;
PIPAddr = ^ TIPAddr;
TIPAddr = rekord
púzdro celé číslo z
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword);
koniec; IPAddr = TIPAddr;
funkcie IcmpCreateFile: THandle; stdcall; externý 'Icmp.dll';
funkcie IcmpCloseHandle (icmpHandle: THandle): boolean;
stdcall; externý 'Icmp.dll'
funkcie IcmpSendEcho
(IcmpHandle: THandle; Cieľová adresa: IPAddr;
RequestData: Ukazovateľ; RequestSize: Smallint;
RequestOptions: ukazovateľ;
ReplyBuffer: Ukazovateľ;
AnswerSize: DWORD;
Časový limit: DWORD): DWORD; stdcall; externý 'Icmp.dll';
funkcie Ping (InetAddress: povrázok): boolean;
implementationuses
WinSock;
funkcie načítanie (var AInput: povrázok;
const Adelie: povrázok = ' ';
const ADelete: Boolean = true)
: povrázok;
var
iPos: Celé číslo;
začať
ak ADelim = # 0 potom začnite
// AnsiPos nefunguje s # 0
iPos: = Pos (ADelim, AInput);
koniec inde začína
iPos: = Pos (ADelim, AInput);
koniec;
ak iPos = 0 potom začnite
Výsledok: = vstup;
ak Adele potom začnite
AInput: = '';
koniec;
koniec inde začína
výsledok: = kópia (vstup, 1, iPos - 1);
ak Adele potom začnite
Odstrániť (AInput, 1, iPos + Dĺžka (ADelim) - 1);
koniec;
koniec;
koniec;
procedúra TranslateStringToTInAddr (AIP: povrázok; var AInAddr);
var
phe: PHostEnt; pac: PChar; GInitData: TWSAData;
začať
WSASartup (101 dolárov, GInitData);
vyskúšať
phe: = GetHostByName (PChar (AIP));
ak Priradené (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
ak Priradené (pac) potom
začať
s TIPAddr (AInAddr) .S_un_b začínam
s_b1: = byte (pac [0]); s_b2: = byte (pac [1]); s_b3: = byte (pac [2]); s_b4: = byte (pac [3]);
koniec;
koniec
inak
začať
raise Výnimka. Vytvoriť („Chyba pri získavaní adresy IP z názvu hostiteľa“);
koniec;
koniec
inak
začať
raise Výnimka. Create ('Chyba pri získaní HostName');
koniec;
leč
FillChar (AInAddr, SizeOf (AInAddr), # 0);
koniec; WSACleanup;
koniec;
funkcie Ping (InetAddress: povrázok): boolean;
var
Rukoväť: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: rad[1..128] z byte;
začať
výsledok: = false; Handle: = IcmpCreateFile;
ak Rukoväť = INVALID_HANDLE_VALUE potom
Východ;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Handle, InAddr, nula, 0, nula, @rep, 128, 0; Výsledok: = (DWO); IcmpCloseHandle (Handle);
koniec;
koniec.