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