Implementering av PING uten å bruke rå stikkontakter

Windows støtter en Internet Control Message Protocol (ICMP) for å bestemme om en bestemt vert er tilgjengelig eller ikke. ICMP er en nettverkslagsprotokoll som leverer flytkontroll, feilmeldinger, ruting og andre data mellom Internett-verter. ICMP brukes først og fremst av applikasjonsutviklere for et nettverk ping.

Hva er en ping?

En ping er prosessen med å sende en ekko-melding til en IP-adresse og lese svaret for å bekrefte en forbindelse mellom TCP / IP-verter. Hvis du skriver en ny applikasjon, vil du være bedre å bruke Winsock 2 raw sockets support, implementert i Indy, for eksempel.

Vær imidlertid oppmerksom på at for Windows NT og Windows 2000-implementeringer er Raw Sockets underlagt sikkerhetskontroller og er bare tilgjengelige for medlemmer av administratorgruppen. Icmp.dll gir funksjonalitet som lar utviklere skrive Internett-ping-applikasjoner på Windows-systemer uten Winsock 2-støtte.

Merk at Winsock 1.1 WSAStartup-funksjonen må ringes før du bruker funksjonene eksponert av ICMP.DLL. Hvis du ikke gjør dette, vil den første samtalen til IcmpSendEcho mislykkes med feil 10091 (WSASYSNOTREADY).

instagram viewer

Nedenfor finner du Ping-enhetens kildekode. Her er to eksempler på bruk.

Eksempel 1: Kodestykke

bruker Ping; ...
konst
ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginIf
Ping. Ping (ADP_IP) deretter ShowMessage ('Om Delphi-programmering tilgjengelig!');
slutt
;

Eksempel 2: Delphi-program for konsollmodus

Neste eksempel er en konsollmodus Delphi-program som bruker Ping-enheten:. Her er Ping-enhetens kilde:

enhet Ping;
interfaceuses

Windows, SysUtils, Classes;
type

TSunB = pakket rekord
s_b1, s_b2, s_b3, s_b4: byte;
slutt
;
TSunW = pakket rekord
s_w1, s_w2: word;
slutt
;
PIPAddr = ^ TIPAddr;
TIPAddr = ta opp
sak
heltall av
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword);
slutt
; IPAddr = TIPAddr;
funksjon
IcmpCreateFile: THandle; STDCALL; utvendig 'Icmp.dll';
funksjon
IcmpCloseHandle (icmpHandle: THandle): boolsk;
STDCALL
; utvendig 'Icmp.dll'
funksjon
IcmpSendEcho
(IcmpHandle: THandle; Destinasjonsadresse: IPAddr;
RequestData: Pointer; RequestSize: Smallint;
RequestOptions: pekeren;
SvarBuffer: Pointer;
ReplySize: DWORD;
Timeout: DWORD): DWORD; STDCALL; utvendig 'Icmp.dll';
funksjon
Ping (InetAddress: string): boolsk;
implementationuses

WinSock;
funksjon
hente (Var AInput: string;
konst
ADelim: string = ' ';
konst
ADelete: Boolsk = sann)
: string;
Var

iPos: Heltall;
begynne
hvis
ADelim = # 0 så begynn
// AnsiPos fungerer ikke med nr. 0

iPos: = Pos (ADelim, AInput);
slutt annet begynner

iPos: = Pos (ADelim, AInput);
slutt
;
hvis
iPos = 0 så begynn
Resultat: = AInput;
hvis
ADelete så begynn
AInput: = '';
slutt
;
slutt annet begynner

resultat: = Copy (AInput, 1, iPos - 1);
hvis
ADelete så begynn
Delete (AInput, 1, iPos + Length (ADelim) - 1);
slutt
;
slutt
;
slutt
;
fremgangsmåte
TranslateStringToTInAddr (AIP: string; Var AInAddr);
Var

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

WSAStartup ($ 101, GInitData);
prøve

phe: = GetHostByName (PChar (AIP));
hvis
Tildelt (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
hvis
Tildelt (pac) deretter
begynne
med
TIPAddr (AInAddr) .S_un_b begynner
s_b1: = Byte (pac [0]); s_b2: = Byte (pac [1]); s_b3: = Byte (pac [2]); s_b4: = Byte (pac [3]);
slutt
;
slutt
ellers
begynne
raise
Unntak. Opprett ('Feil ved å få IP fra HostName');
slutt
;
slutt
ellers
begynne
raise
Unntak. Opprett ('Feil ved å få vertsnavn');
slutt
;
unntatt

FillChar (AInAddr, SizeOf (AInAddr), # 0);
slutt
; WSACleanup;
slutt
;
funksjon
Ping (InetAddress: string): boolsk;
Var

Håndtak: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: matrise[1..128] av byte;
begynne

resultat: = falsk; Håndtak: = IcmpCreateFile;
hvis
Håndtak = INVALID_HANDLE_VALUE deretter
Exit;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Håndtak, InAddr, nil, 0, nil, @ rep, 128, 0); Resultat: = (DW 0); IcmpCloseHandle (Håndtak);
slutt
;​
slutt
.