Computerwissenschaften

Implementieren von PING ohne Verwendung von Raw-Sockets

Windows unterstützt ein Internet Control Message Protocol (ICMP), um festzustellen, ob ein bestimmter Host verfügbar ist oder nicht. ICMP ist ein Netzwerkschichtprotokoll, das Flusskontrolle, Fehlermeldungen, Routing und andere Daten zwischen Internet-Hosts bereitstellt. ICMP wird hauptsächlich von Anwendungsentwicklern für einen Netzwerk-Ping verwendet.

 

Was ist ein Ping?

Ein Ping ist der Vorgang des Sendens einer Echo-Nachricht an eine IP-Adresse und des Lesens der Antwort, um eine Verbindung zwischen TCP / IP-Hosts zu überprüfen . Wenn Sie eine neue Anwendung schreiben, ist es besser, die Unterstützung für Winsock 2-Raw-Sockets zu verwenden, die beispielsweise in Indy implementiert ist  .

Beachten Sie jedoch, dass Raw-Sockets für Windows NT- und Windows 2000-Implementierungen Sicherheitsüberprüfungen unterliegen und nur Mitgliedern der Administratorgruppe zugänglich sind. Icmp.dll bietet Funktionen, mit denen Entwickler Internet-Ping-Anwendungen auf Windows-Systemen ohne Winsock 2-Unterstützung schreiben können.

Beachten Sie, dass die Winsock 1.1 WSAStartup-Funktion aufgerufen werden muss, bevor die von ICMP.DLL bereitgestellten Funktionen verwendet werden. Wenn Sie dies nicht tun, schlägt der erste Aufruf von IcmpSendEcho mit dem Fehler 10091 (WSASYSNOTREADY) fehl.

Unten finden Sie den Quellcode der Ping-Einheit. Hier sind zwei Anwendungsbeispiele.

 

Beispiel 1: Code-Snippet

verwendet Ping; ... 
const ADP_IP='208.185.127.40'; (* http://delphi.about.com *) 
beginIf Ping.Ping (ADP_IP) dann ShowMessage ('Über Delphi Programming erreichbar!'); 
Ende ;

 

Beispiel 2: Delphi-Programm im Konsolenmodus

Unser nächstes Beispiel ist ein Delphi-Programm im Konsolenmodus  , das die Ping-Einheit verwendet :. Hier ist die Quelle der Ping-Einheit:

Einheit Ping; 
interfaceuses
 Windows SysUtils, Classes; 
Typ
 TSunB=gepackter Datensatz
 s_b1, s_b2, s_b3, s_b4: Byte; 
Ende ; 
TSunW=gepackter Datensatz
 s_w1, s_w2: Wort; 
Ende ; 
PIPAddr=^ TIPAddr; 
TIPAddr=Datensatz 
Fall ganze Zahl von
 0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (s_addr: Langwort); 
Ende ; IPAddr=TIPAddr; 
Funktion IcmpCreateFile: THandle; stdcall ; externe 'icmp.dll'; 
Funktion IcmpCloseHandle (icmpHandle: THandle): boolean; 
stdcall ; externe 'icmp.dll'- 
Funktion IcmpSendEcho 
(IcmpHandle: THandle; DestinationAddress: IPAddr; 
RequestData: Pointer; RequestSize: Smallint; 
RequestOptions: Zeiger; 
ReplyBuffer: Pointer; 
ReplySize: DWORD; 
Timeout: DWORD): DWORD; stdcall ; externe 'icmp.dll'; 
Funktion Ping (InetAddress: string ): boolean; 
Implementierung verwendet
 WinSock; 
Funktion Fetch ( var AInput: string ; 
const ADelim: string=''; 
const ADelete: Boolean=true) 
: string ; 
var
 iPos: Integer; 
begin 
wenn ADelim=# 0 dann begin 
// AnsiPos funktioniert nicht mit # 0
 iPos:=Pos (ADelim, AInput); 
Ende sonst Anfang
 iPos:=Pos (ADelim, AInput); 
Ende ; 
Wenn iPos=0, dann beginne
 Ergebnis:=AInput; 
Wenn ADelete, dann beginne
 AInput:=''; 
Ende ; 
end else begin
 result:=Kopieren (AInput, 1, iPos - 1); 
Wenn ADelete, beginnen Sie mit
 Löschen (AInput, 1, iPos + Length (ADelim) - 1). 
Ende ; 
Ende ; 
Ende ; 
procedure TranslateStringToTInAddr (AIP: string ; var AInAddr); 
var
 phe: PHostEnt; pac: PChar; GInitData: TWSAData; 
begin
 WSAStartup ($ 101, GInitData); 
try
 phe:=GetHostByName (PChar (AIP)); 
wenn zugewiesen (phe), dann beginne
 pac:=phe ^ .h_addr_list ^; 
Wenn zugewiesen (pac), dann 
beginne 
mit TIPAddr (AInAddr) .S_un_b beginne
 s_b1:=Byte (pac [0]); s_b2:=Byte (pac [1]); s_b3:=Byte (pac [2]); s_b4 :=Byte (pac [3]); 
Ende ; 
Ende 
sonst 
beginnt 
Erhöhung Exception.Create ( ‚Fehler beim Abrufen der IP von Host - Namen‘); 
Ende ; 
Ende 
sonst 
beginnen 
Erhöhung Exception.Create ( ‚Fehler beim Host - Name‘); 
Ende ; 
außer
 FillChar (AInAddr, SizeOf (AInAddr), # 0); 
Ende ; WSACleanup; 
Ende ; 
Funktion Ping (InetAddress: string ): boolean; 
var
 Griff: THandle; 
InAddr: IPAddr; 
DW: DWORD; 
rep: Array [1..128] von Byte; Ergebnis 
beginnen
 :=false; Handle:=IcmpCreateFile; 
wenn Handle=INVALID_HANDLE_VALUE, dann
 Exit; 
TranslateStringToTInAddr (InetAddress, InAddr); 
DW:=IcmpSendEcho (Handle, InAddr, nil , 0, nil , @rep, 128, 0); Ergebnis:=(DW 0); IcmpCloseHandle (Handle); 
Ende ; 
Ende .

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.