Implementering af PING uden brug af rå stikkontakter

vinduer understøtter en Internet Control Message Protocol (ICMP) til at bestemme, om en bestemt vært er tilgængelig eller ikke. ICMP er en netværkslagsprotokol, der leverer flowkontrol, fejlmeddelelser, routing og andre data mellem internetværter. ICMP bruges primært af applikationsudviklere til et netværksping.

Hvad er en ping?

En ping er processen med at sende en ekko-meddelelse til en IP-adresse og læse svaret for at bekræfte en forbindelse mellem TCP / IP-værter. Hvis du skriver en ny ansøgning, er du bedre at bruge Winsock 2 råstikket, der er implementeret i Indy, for eksempel.

Bemærk dog, at for Windows NT og Windows 2000-implementeringer er Raw Sockets underlagt sikkerhedskontrol og er kun tilgængelige for medlemmer af administratorgruppen. Icmp.dll leverer funktionalitet, der giver udviklere mulighed for at skrive internet-ping-applikationer på Windows-systemer uden Winsock 2-support.

Bemærk, at Winsock 1.1 WSAStartup-funktionen skal kaldes op inden brug af de funktioner, der er eksponeret af ICMP.DLL. Hvis du ikke gør dette, vil det første opkald til IcmpSendEcho mislykkes med fejl 10091 (WSASYSNOTREADY).

instagram viewer

Nedenfor kan du finde Ping-enhedens kildekode. Her er to eksempler på brug.

Eksempel 1: Kodestykker

anvendelser Ping; ...
const
ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginIf
Ping. Ping (ADP_IP) derefter ShowMessage ('Om Delphi-programmering tilgængelig!');
ende
;

Eksempel 2: Delphi-program til konsoltilstand

Vores næste eksempel er en konsoltilstand Delphi-program der bruger Ping-enheden:. Her er Ping-enhedens kilde:

enhed Ping;
interfaceuses

Windows, SysUtils, klasser;
type

TSunB = pakket rekord
s_b1, s_b2, s_b3, s_b4: byte;
ende
;
TSunW = pakket rekord
s_w1, s_w2: word;
ende
;
PIPAddr = ^ TIPAddr;
TIPAddr = optage
sag
heltal af
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword);
ende
; IPAddr = TIPAddr;
fungere
IcmpCreateFile: THandle; stdcall; udvendig 'Icmp.dll';
fungere
IcmpCloseHandle (icmpHandle: THandle): boolsk;
stdcall
; udvendig 'Icmp.dll'
fungere
IcmpSendEcho
(IcmpHandle: THandle; DestinationAddress: IPAddr;
RequestData: Pointer; RequestSize: Smallint;
RequestOptions: pointer;
ReplyBuffer: Pointer;
ReplySize: DWORD;
Timeout: DWORD): DWORD; stdcall; udvendig 'Icmp.dll';
fungere
Ping (InetAddress: snor): boolsk;
implementationuses

WinSock;
fungere
Fetch (Var AInput: snor;
const
ADelim: snor = ' ';
const
ADelete: Boolsk = sand)
: snor;
Var

iPos: Heltal;
begynde
hvis
ADelim = # 0 derefter begynde
// AnsiPos fungerer ikke med # 0

iPos: = Pos (ADelim, AInput);
slut andet begynder

iPos: = Pos (ADelim, AInput);
ende
;
hvis
iPos = 0 derefter begynde
Resultat: = AInput;
hvis
ASletning derefter begynde
AInput: = '';
ende
;
slut andet begynder

resultat: = Copy (AInput, 1, iPos - 1);
hvis
ASletning derefter begynde
Slet (AInput, 1, iPos + Længde (ADelim) - 1);
ende
;
ende
;
ende
;
procedure
TranslateStringToTInAddr (AIP: snor; Var AInAddr);
Var

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

WSAStartup ($ 101, GInitData);
prøve

phe: = GetHostByName (PChar (AIP));
hvis
Tildelt (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
hvis
Tildelt (pac) derefter
begynde
med
TIPAddr (AInAddr) .S_un_b begynder
s_b1: = Byte (pac [0]); s_b2: = Byte (pac [1]); s_b3: = Byte (pac [2]); s_b4: = Byte (pac [3]);
ende
;
ende
andet
begynde
hæve
Undtagelse. Opret ('Fejl ved hentning af IP fra HostName');
ende
;
ende
andet
begynde
hæve
Undtagelse. Opret ('Fejl ved hentning af værtsnavn');
ende
;
undtagen

FillChar (AInAddr, SizeOf (AInAddr), # 0);
ende
; WSACleanup;
ende
;
fungere
Ping (InetAddress: snor): boolsk;
Var

Håndtag: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: matrix[1..128] af byte;
begynde

resultat: = falsk; Håndtag: = IcmpCreateFile;
hvis
Håndtag = INVALID_HANDLE_VALUE derefter
Afslut;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Håndtag, InAddr, nul, 0, nul, @rep, 128, 0); Resultat: = (DW 0); IcmpCloseHandle (håndtag);
ende
;​
ende
.
instagram story viewer