Windows stöder ett Internet Control Message Protocol (ICMP) för att avgöra om en viss värd är tillgänglig eller inte. ICMP är ett nätverkslagerprotokoll som levererar flödeskontroll, felmeddelanden, routing och annan data mellan internetvärdar. ICMP används främst av applikationsutvecklare för ett nätverksping.
Vad är en ping?
En ping är processen att skicka ett ekomeddelande till en IP-adress och läsa svaret för att verifiera en anslutning mellan TCP / IP-värdar. Om du skriver en ny applikation är du bättre att använda Winsock 2 råa uttagssupport, implementerat i Indy, till exempel.
Observera dock att för Windows NT och Windows 2000-implementeringar är Raw Sockets underkastade säkerhetskontroller och endast tillgängliga för medlemmar i administratörens grupp. Icmp.dll tillhandahåller funktionalitet som gör det möjligt för utvecklare att skriva Internet-ping-applikationer på Windows-system utan Winsock 2-stöd.
Observera att Winsock 1.1 WSAStartup-funktionen måste anropas innan de funktioner som exponeras av ICMP.DLL används. Om du inte gör detta kommer det första samtalet till IcmpSendEcho att misslyckas med fel 10091 (WSASYSNOTREADY).
Nedan hittar du Ping-enhetens källkod. Här är två exempel på användning.
Exempel 1: Kodavsnitt
användningar Ping; ...
const ADP_IP = '208.185.127.40'; (* http://delphi.about.com *)
beginIf Ping. Ping (ADP_IP) sedan ShowMessage ('Om Delphi-programmering nås!');
slutet;
Exempel 2: Delphi-program för konsolläge
Vårt nästa exempel är ett konsolläge Delphi-program som använder Ping-enheten:. Här är Ping-enhetens källa:
enhet ping;
interfaceuses
Windows, SysUtils, klasser;
typ
TSunB = packad skiva
s_b1, s_b2, s_b3, s_b4: byte;
slutet;
TSunW = packad skiva
s_w1, s_w2: word;
slutet;
PIPAddr = ^ TIPAddr;
TIPAddr = spela in
fall heltal av
0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword);
slutet; IPAddr = TIPAddr;
fungera IcmpCreateFile: THandle; stdcall; extern 'Icmp.dll';
fungera IcmpCloseHandle (icmpHandle: THandle): boolean;
stdcall; extern 'Icmp.dll'
fungera IcmpSendEcho
(IcmpHandle: THandle; DestinationAddress: IPAddr;
RequestData: Pekare; RequestSize: Smallint;
RequestOptions: pekare;
AnswerBuffer: Pointer;
ReplySize: DWORD;
Timeout: DWORD): DWORD; stdcall; extern 'Icmp.dll';
fungera Ping (InetAddress: sträng): booleska;
implementationuses
WinSock;
fungera Hämta(var AInput: sträng;
const ADelim: sträng = ' ';
const ADelete: Boolean = true)
: sträng;
var
iPos: heltal;
Börja
om ADelim = # 0 börja sedan
// AnsiPos fungerar inte med # 0
iPos: = Pos (ADelim, AInput);
slut annat börjar
iPos: = Pos (ADelim, AInput);
slutet;
om iPos = 0 börja sedan
Resultat: = AInput;
om ADelete börja sedan
AInput: = '';
slutet;
slut annat börjar
resultat: = Kopiera (AInput, 1, iPos - 1);
om ADelete börja sedan
Radera (AInput, 1, iPos + Längd (ADelim) - 1);
slutet;
slutet;
slutet;
procedur TranslateStringToTInAddr (AIP: sträng; var AInAddr);
var
phe: PHostEnt; pac: PChar; GInitData: TWSAData;
Börja
WSAStartup ($ 101, GInitData);
Prova
phe: = GetHostByName (PChar (AIP));
om Tilldelad (phe) thenbegin
pac: = phe ^ .h_addr_list ^;
om Tilldelad (pac) sedan
Börja
med TIPAddr (AInAddr) .S_un_b börjar
s_b1: = Byte (pac [0]); s_b2: = Byte (pac [1]); s_b3: = Byte (pac [2]); s_b4: = Byte (pac [3]);
slutet;
slutet
annan
Börja
höja Undantag. Skapa ('Fel vid hämtning av IP från värdnamn');
slutet;
slutet
annan
Börja
höja Undantag. Skapa ('Fel vid hämtning av värdnamn');
slutet;
bortsett från
FillChar (AInAddr, SizeOf (AInAddr), # 0);
slutet; WSACleanup;
slutet;
fungera Ping (InetAddress: sträng): booleska;
var
Handtag: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: array[1..128] av bitgrupp;
Börja
resultat: = falsk; Handle: = IcmpCreateFile;
om Handtag = INVALID_HANDLE_VALUE sedan
Utgång;
TranslateStringToTInAddr (InetAddress, InAddr);
DW: = IcmpSendEcho (Handle, InAddr, noll, 0, noll, @rep, 128, 0); Resultat: = (DW 0); IcmpCloseHandle (Handle);
slutet;
slutet.