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