A PING megvalósítása nyers aljzatok használata nélkül

ablakok támogatja az Internet Control Message Protocol (ICMP) protokollt annak meghatározására, hogy rendelkezésre áll-e egy adott gazdagép. Az ICMP egy hálózati rétegű protokoll, amely folyamatvezérlést, hibaüzeneteket, útválasztást és egyéb adatokat továbbít az internetes gépek között. Az ICMP-t elsősorban az alkalmazásfejlesztők használják hálózati ping-okhoz.

Mi az a ping?

A ping az a folyamat, amikor visszhang üzenetet küld egy IP-címre, és elolvassa a választ, hogy ellenőrizze a közötti kapcsolatot TCP / IP gazdagépek. Ha új alkalmazást ír, akkor jobb, ha a Winsock 2 nyers socket-támogatást használja, amelyet 2006-ban implementáltak Indy, például.

Felhívjuk azonban figyelmét, hogy a Windows NT és a Windows 2000 implementációk esetén a Raw Socket-ek biztonsági ellenőrzés alá esnek, és csak a rendszergazdai csoport tagjai számára érhetők el. Az Icmp.dll olyan funkciókat kínál, amelyek lehetővé teszik a fejlesztők számára, hogy Internet ping alkalmazásokat írjanak a Windows rendszerekre Winsock 2 támogatás nélkül.

instagram viewer

Vegye figyelembe, hogy a Winsock 1.1 WSAStartup funkciót meg kell hívni az ICMP.DLL által feltárt funkciók használata előtt. Ha nem ezt teszi meg, akkor az IcmpSendEcho első hívása 10091 hibával sikertelen lesz (WSASYSNOTREADY).

Az alábbiakban megtalálja a Ping egység forráskódját. Íme két példa a felhasználásra.

1. példa: Kódrészlet

felhasználások Ping; ...
const
ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginIf
Ping. Ping (ADP_IP) azután ShowMessage ('A Delphi programozásáról elérhető!');
vég
;

2. példa: Konzol mód Delphi program

Következő példa a konzol mód Delphi program amely a Ping egységet használja: Itt található a Ping egység forrása:

Mértékegység Ping;
interfaceuses

Windows, SysUtils, Osztályok;
típus

TSunB = csomagolt rekord
s_b1, s_b2, s_b3, s_b4: byte;
vég
;
TSunW = csomagolt rekord
s_w1, s_w2: szó;
vég
;
PIPAddr = ^ TIPAddr;
TIPAddr = rekord
ügy
egész szám nak,-nek
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: hosszúszó);
vég
IPAddr = TIPAddr;
funkció
IcmpCreateFile: Thandle; stdcall; külső 'Icmp.dll';
funkció
IcmpCloseHandle (icmpHandle: THandle): logikai;
stdcall
; külső 'Icmp.dll'
funkció
IcmpSendEcho
(IcmpHandle: THandle; DestinationAddress: IPAddr;
RequestData: Pointer; RequestSize: Smallint;
RequestOptions: mutató;
VálaszBuffer: Mutató;
Válasz méret: DWORD;
Időtúllépés: DWORD): DWORD; stdcall; külső 'Icmp.dll';
funkció
Ping (InetAddress: húr): logikai;
implementationuses

WinSock;
funkció
Fetch (var AInput: húr;
const
ADelim: húr = ' ';
const
ADelete: logikai = igaz)
: húr;
var

iPOS: egész szám;
kezdődik
ha
ADelim = # 0 akkor kezdje el
// Az AnsiPos nem működik a # 0-zal

iPos: = Pos (ADelim, AInput);
a másik vége kezdődik

iPos: = Pos (ADelim, AInput);
vég
;
ha
iPos = 0 akkor kezdje el
Eredmény: = AInput;
ha
ADelete akkor kezdje el
AInput: = '';
vég
;
a másik vége kezdődik

eredmény: = Másolás (AInput, 1, iPos - 1);
ha
ADelete akkor kezdje el
Törlés (AInput, 1, iPos + Length (ADelim) - 1);
vég
;
vég
;
vég
;
eljárás
TranslateStringToTInAddr (AIP: húr; var AInAddr);
var

phe: PHostEnt; pac: PChar; GInitData: TWSAData;
kezdődik

WSAStartup ($ 101, GInitData);
próbáld ki

phe: = GetHostByName (PChar (AIP));
ha
Hozzárendelt (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
ha
Hozzárendelt (pac) azután
kezdődik
val vel
TIPAddr (AInAddr) .S_un_b kezdődik
s_b1: = Byte (pac [0]); s_b2: = Byte (pac [1]); s_b3: = Byte (pac [2]); s_b4: = Byte (pac [3]);
vég
;
vég
más
kezdődik
emel
Kivétel. Létrehozás ('Hiba az IP megszerzésekor a HostNameből');
vég
;
vég
más
kezdődik
emel
Kivétel. Létrehozás ('Hiba a HostName megszerzésekor');
vég
;
kivéve

FillChar (AInAddr, SizeOf (AInAddr), # 0);
vég
; WSACleanup;
vég
;
funkció
Ping (InetAddress: húr): logikai;
var

Fogantyú: THandle;
InAddr: IPAddr;
DW: DWORD;
ismétlés: sor[1..128] nak,-nek byte;
kezdődik

eredmény: = hamis; Fogantyú: = IcmpCreateFile;
ha
Fogantyú = INVALID_HANDLE_VALUE azután
Kijárat;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Fogantyú, InAddr, nulla, 0, nulla, @rep, 128, 0); eredmény: = (DW 0); IcmpCloseHandle (Fogantyú);
vég
;​
vég
.
instagram story viewer