Įdiegti PING nenaudojant neapdorotų lizdų

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

instagram viewer

Ž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
.