„Windows“ palaiko interneto valdymo pranešimų protokolą (ICMP), kad nustatytų, ar yra tam tikras pagrindinis kompiuteris. ICMP yra tinklo sluoksnio protokolas, teikiantis srauto valdymą, klaidų pranešimus, maršruto parinkimą ir kitus duomenis tarp interneto kompiuterių. ICMP pirmiausia naudoja programų kūrėjai, norėdami tinklo ping.
Kas yra „Ping“?
„Ping“ yra echo pranešimo siuntimas į IP adresą ir atsakymo skaitymas, norint patikrinti ryšį tarp TCP / IP prieglobos. Jei rašote naują programą, jums bus geriau naudoti „Winsock 2“ neapdorotų lizdų palaikymą, įdiegtą 2007 m Indy, pavyzdžiui.
Tačiau atminkite, kad „Windows NT“ ir „Windows 2000“ diegimuose neapdorotiems lizdams taikomi saugos patikrinimai ir jais gali naudotis tik administratoriaus grupės nariai. „Icmp.dll“ teikia funkcijas, leidžiančias kūrėjams rašyti interneto „ping“ programas „Windows“ sistemose be „Winsock 2“ palaikymo.
Atminkite, kad prieš naudojant ICMP.DLL veikiamas funkcijas, reikia iškviesti „Winsock 1.1 WSAStartup“ funkciją. Jei to nepadarysite, pirmasis skambutis „IcmpSendEcho“ nepavyks su klaida 10091 (WSASYSNOTREADY).
Žemiau galite rasti „Ping“ įrenginio šaltinio kodą. Čia yra du naudojimo pavyzdžiai.
1 pavyzdys: kodo fragmentas
naudoja Pingas; ...
const ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
pradžiosJei Pingas. „Ping“ (ADP_IP) tada „ShowMessage“ ('Pasiekiama apie „Delphi“ programavimą!);
galas;
2 pavyzdys: „Console Mode Delphi“ programa
Kitas mūsų pavyzdys yra konsolinis režimas „Delphi“ programa kuriame naudojamas „Ping“ įtaisas:. Štai „Ping“ įrenginio šaltinis:
vienetas Pingas;
sąsajos
„Windows“, „SysUtils“, klasės;
tipo
TSunB = supakuotas įrašas
s_b1, s_b2, s_b3, s_b4: baitas;
galas;
TSunW = supakuotas įrašas
s_w1, s_w2: žodis;
galas;
PIPAddr = ^ TIPAddr;
TIPAddr = įrašas
atvejis sveikasis skaičius apie
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword);
galas; IPAddr = TIPAddr;
funkcija „IcmpCreateFile“: „Thandle“; stdcall; išorinis 'icmp.dll';
funkcija „IcmpCloseHandle“ („icmpHandle“: „Thandle“): loginis;
stdcall; išorinis „icmp.dll“
funkcija „IcmpSendEcho“
(„IcmpHandle“: „Thandle“; Paskirties adresas: IPAddr;
„RequestData“: rodyklė; „RequestSize“: „Smallint“;
„RequestOptions“: rodyklė;
„ReplyBuffer“: rodyklė;
Atsakyti dydį: DWORD;
Laikas: DWORD): DWORD; stdcall; išorinis 'icmp.dll';
funkcija „Ping“ („InetAddress“: stygos): boolean;
įgyvendinimai
„WinSock“;
funkcija Gauti (var Įvestis: stygos;
const „ADelim“: stygos = ' ';
const ADelete: loginė = teisinga)
: stygos;
var
„iPos“: sveikasis skaičius;
prasideda
jei ADelim = # 0 tada pradėk
// „AnsiPos“ neveikia su # 0
„iPos“: = „Pos“ („ADelim“, „AInput“);
pabaiga dar prasideda
„iPos“: = „Pos“ („ADelim“, „AInput“);
galas;
jei „iPos“ = 0 tada pradėk
Rezultatas: = AĮvestis;
jei „ADelete“ tada pradėk
AĮvestis: = '';
galas;
pabaiga dar prasideda
rezultatas: = Kopijuoti („AInput“, 1, „iPos“ - 1);
jei „ADelete“ tada pradėk
Ištrinti („AInput“, 1, „iPos +“ ilgio („ADelim“ - 1));
galas;
galas;
galas;
procedūra „TranslateStringToTInAddr“ (AIP: stygos; var AInAddr);
var
phe: PHostEnt; pac: PChar; „GInitData“: TWSAData;
prasideda
„WSAStartup“ (101 USD, „GInitData“);
bandyti
phe: = GetHostByName (PChar (AIP));
jei Paskirtas (phe) tada pradedama
pac: = phe ^ .h_addr_list ^;
jei Paskirtas (pac) tada
prasideda
su „TIPAddr“ (AInAddr) .S_un_b pradėti
s_b1: = baitas (pac [0]); s_b2: = baitas (pac [1]); s_b3: = baitas (pac [2]); s_b4: = baitas (pac [3]);
galas;
galas
Kitas
prasideda
kelti Išimtis. Kurti ('Klaida gaunant IP iš HostName');
galas;
galas
Kitas
prasideda
kelti Išimtis. Kurti ('Klaida gaunant pagrindinį kompiuterio vardą');
galas;
išskyrus
„FillChar“ (AInAddr, SizeOf (AInAddr), # 0);
galas; WSACleanup;
galas;
funkcija „Ping“ („InetAddress“: stygos): boolean;
var
Rankena: Dangtis;
„InAddr“: IPAddr;
DW: DWORD;
rep: masyvas[1..128] apie baitas;
prasideda
rezultatas: = klaidingas; Rankena: = IcmpCreateFile;
jei Rankena = INVALID_HANDLE_VALUE tada
Išeiti;
„TranslateStringToTInAddr“ („InetAddress“, „InAddr“);
DW: = „IcmpSendEcho“ (rankena, „InAddr“, „ nulis, 0, nulis, @rep, 128, 0); Rezultatas: = (DW 0); IcmpCloseHandle (rankena);
galas;
galas.