Delphi-Programmierung zur Implementierung der Ping-Operation
Zhang Taili
Benutzer, die das Internet genutzt haben, sind mit dem Befehl „Ping“ vertraut. Es handelt sich um eine ausführbare Datei unter DOS. Sie wird im Allgemeinen verwendet, um die Qualität der Netzwerkverbindung zu überprüfen. Das Grundprinzip besteht darin, eine Funktion im ICMP-Protokoll im TCP/IP-Protokollpaket zu verwenden, das heißt, eine Anfrage an den angegebenen Computer zu senden, und der Computer, der die Anfrage empfängt, gibt eine Antwort zurück, um festzustellen, ob der Computer läuft im Internet oder um das Netzwerk zu überprüfen. Ist die Verbindung stabil und zuverlässig? Während der Ausführung des Ping-Programms verbrauchen beide Computer nur sehr wenig Ressourcen, daher handelt es sich um ein sehr praktisches Tool.
Wir können die „Ping“-Operation durch Programmierung implementieren und so verbessern, dass sie einen Windows-Oberflächenstil hat und die Anzeige intuitiver als DOS ist.
Zunächst eine kurze Erläuterung der bei der Programmierung benötigten Dynamic Link Library: Im Systemverzeichnis von Windows finden Sie die Datei Icmp.dll. Diese Dynamic Link Library stellt alle Funktionen des ICMP-Protokolls zur Verfügung der Aufruf einer Dynamic Link Library.
Die aufrufenden Funktionen in der Datei Icmp.dll werden wie folgt beschrieben:
1. IcmpCreateFile
Öffnet ein Handle, über das Sie ICMP-Anfrage-Echonachrichten senden können.
2. IcmpCloseHandle
Schließen Sie das Handle, das Sie über die Funktion IcmpCreateFile geöffnet haben.
3. IcmpSendEcho
Senden Sie eine ICMP-Anfrage über das von Ihnen geöffnete Handle und kehren Sie nach einer Zeitüberschreitung oder dem Empfang einer Antwortnachricht zurück. Seine Parameter stimmen im Wesentlichen mit seiner Rahmenstruktur überein. Die spezifische Bedeutung finden Sie in Büchern zum ICMP-Protokoll.
Nachdem wir die oben genannten drei Funktionen vorläufig verstanden haben, können wir mit der Programmierung beginnen.
Zunächst sollte unser Programm nach der Ausführung über die in Abbildung 1 gezeigten Grundfunktionen verfügen. Dazu können wir zunächst die im Bild oben rechts gezeigten Steuerelemente wie Schaltflächen, Bearbeitungsfelder und Textanzeigefelder in das Delphi-Fenster einfügen.
(G72.JPG)
Schematische Darstellung des Routinebetriebs
Anschließend wird WinSocket zu Beginn des Programms initialisiert (FormCreate). Seine Funktion besteht darin, die verwendeten Versionsinformationen zu deklarieren und gleichzeitig die Icmp.dll-Bibliothek aufzurufen.
Typ
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = gepackter Datensatz
TTL: Byte;
TOS: Byte;
Flags: Byte;
OptionenGröße: Byte;
OptionsData: PChar;
Ende;
PIcmpEchoReply = ^TIcmpEchoReply;
TICmpEchoReply = gepackter Datensatz
Adresse: DWord;
Status: DWORD;
RTT: DWORD;
Datengröße: Word;
Reserviert: Wort;
Daten: Zeiger;
Optionen: TIPOptionInformation;
Ende;
TICmpCreateFile = function: THandle;
TICmpCloseHandle = function(IcmpHandle: THandle): Boolean;
TicmpSendEcho = function(IcmpHandle:THandle;
Zieladresse: DWORD;
RequestData: Zeiger;
RequestSize: Word;
RequestOptions: PIPOptionInformation;
ReplyBuffer: Zeiger;
Antwortgröße: DWord;
Zeitüberschreitung: DWord
): DWord; stdcall;
TMyPing = class(TForm)
Panel1: TPanel;
Label1: TLabel;
PingEdit: TEdit;
ExeBtn: TButton;
Button2: TButton;
Button3: TButton;
StatusShow: TMemo;
PROcedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ExeBtnClick(Sender: TObject);
Privat
{Private Erklärungen}
HICMP: HANDLE;
IcmpCreateFile:TIcmpCreateFile;
IcmpCloseHandle: TicmpCloseHandle;
IcmpSendEcho: TicmpSendEcho;
öffentlich
{Öffentliche Erklärungen}
Ende;
procedure TMyPing.FormCreate(Sender: TObject);
var
WSAData: TWSAData;
hICMPdll: HMODULE;
beginnen
WSAStartup($101, WSAData);
// Laden Sie das icmp.dll-Material
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP := IcmpCreateFile;
StatusShow.Text := ';
StatusShow.Lines.Add('Rückgabezeit der Ziel-IP-Adressbytes (Millisekunden)');
Ende;
Als nächstes ist es an der Zeit, den eigentlichen Programmiervorgang des Ping-Vorgangs durchzuführen, wie unten gezeigt.
procedure TMyPing.ExeBtnClick(Sender: TObject);
var
IPOpt:TIPOptionInformation;//IP-Optionen für das zu sendende Paket
FIPAddress:DWORD;
pReqData,pRevData:PChar;
pIPE:PIcmpEchoReply;//ICMP-Echo-Antwortpuffer
FSize: DWORD;
MyString:string;
FTimeOut:DWORD;
Puffergröße:DWORD;
beginnen
if PingEdit.Text <> ' dann
beginnen
FIPAddress := inet_addr(PChar(PingEdit.Text));
FGröße := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
FillChar(pIPE^, SizeOf(pIPE^), 0);
pIPE^.Data := pRevData;
MyString := 'Hallo,Welt';
pReqData := PChar(MyString);
FillChar(IPOpt, Sizeof(IPOpt), 0);
IPOpt.TTL := 64;
FTimeOut := 4000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString), @IPOpt, pIPE, BufferSize, FTimeOut);
wenn pReqData^ = pIPE^.Options.OptionsData^ dann
beginnen
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
Ende;
FreeMem(pRevData);
FreeMem(pIPE);
Ende
Ende;
Durch die obige Programmierung haben wir die Schnittstellenoperation der Ping-Funktion realisiert. Tatsächlich gibt es viele Funktionen des ICMP-Protokolls, die durch Funktionsaufrufe an Icmp.dll realisiert werden können.