Implementera PING utan att använda råa uttag

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

instagram viewer

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
.
instagram story viewer