Programmation Delphi pour implémenter l'opération Ping
Zhang Taili
Les utilisateurs ayant utilisé Internet connaissent la commande « Ping ». Il s'agit d'un fichier exécutable sous DOS. Il est généralement utilisé pour vérifier la qualité de la connexion réseau. Le principe de base est d'utiliser une fonction du protocole ICMP dans le package de protocole TCP/ip, c'est-à-dire d'envoyer une requête à l'ordinateur spécifié, et l'ordinateur qui reçoit la requête renvoie une réponse pour déterminer si l'ordinateur fonctionne sur Internet ou pour vérifier le réseau. La connexion est-elle stable et fiable ? Lors de l'exécution du programme Ping, les deux ordinateurs consomment très peu de ressources, c'est donc un outil très pratique.
Nous pouvons implémenter l'opération "Ping" par programmation et l'améliorer pour qu'elle ait un style d'interface Windows et que l'affichage soit plus intuitif que DOS.
Tout d'abord, une brève explication de la bibliothèque de liens dynamiques nécessaire à la programmation : Dans le répertoire Système de Windows, vous pouvez trouver le fichier Icmp.dll Cette bibliothèque de liens dynamiques fournit toutes les fonctions du protocole ICMP. Notre programmation est basée sur celui-ci. l'appel de la bibliothèque de liens dynamiques.
Les fonctions appelantes dans le fichier Icmp.dll sont décrites comme suit :
1. IcmpCreateFile
Ouvre un handle via lequel vous pouvez envoyer des messages d’écho de requête ICMP.
2. IcmpCloseHandle
Fermez le handle que vous avez ouvert via la fonction IcmpCreateFile.
3. IcmpSendEcho
Envoyez une requête ICMP via le handle que vous avez ouvert et revenez après l'expiration du délai ou la réception du message de réponse. Ses paramètres sont fondamentalement cohérents avec sa structure de trame. Veuillez vous référer à la partie programme ci-dessous. Pour sa signification spécifique, vous pouvez vous référer aux livres sur le protocole ICMP.
Après une compréhension préliminaire des trois fonctions ci-dessus, nous pouvons commencer la programmation.
Tout d'abord, notre programme doit avoir les fonctions de base illustrées dans la figure 1 après son exécution. Pour ce faire, nous pouvons d'abord placer les contrôles affichés dans l'image supérieure droite dans la fenêtre Delphi, tels que les boutons, les zones d'édition et les zones d'affichage de texte.
(G72.JPG)
Diagramme schématique du fonctionnement de routine
Ensuite, WinSocket est initialisé au début du programme (FormCreate). Sa fonction est de déclarer les informations de version utilisées et en même temps d'appeler la bibliothèque Icmp.dll.
taper
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = enregistrement compressé
TTL : octet ;
TOS : octet ;
Indicateurs : octet ;
OptionsTaille : octet ;
OptionsDonnées : PChar ;
fin;
PIcmpEchoReply = ^TIcmpEchoReply;
TICmpEchoReply = enregistrement compressé
Adresse : DWord ;
Statut : DWORD ;
RTT : DWORD ;
Taille des données : Word ;
Réservé : Mot ;
Données : Pointeur ;
Options : TIPOptionInformation ;
fin;
TICmpCreateFile = fonction : THandle ;
TICmpCloseHandle = fonction (IcmpHandle : THandle) : Boolean ;
TicmpSendEcho = fonction (IcmpHandle:THandle;
Adresse de destination : DWORD ;
RequestData : pointeur ;
Taille de la demande : Word ;
Options de requête : PIPOptionInformation ;
ReplyBuffer : pointeur ;
Taille de réponse : DWord ;
Délai d'expiration : DWord
) : DWord ;
TMyPing = classe (TForm)
Panneau 1 : TPanel ;
Étiquette1 : TLabel ;
PingEdit : TEdit ;
ExeBtn : TButton ;
Bouton2 : TButton ;
Bouton3 : TButton ;
StatusShow : TMemo ;
PProcédure Button3Click (Expéditeur : TObject );
procédure FormCreate(Expéditeur : TObject);
procédure ExeBtnClick(Expéditeur : TObject);
privé
{Déclarations privées}
hICMP : POIGNÉE ;
IcmpCreateFile : TicmpCreateFile ;
IcmpCloseHandle : TicmpCloseHandle ;
IcmpSendEcho : TicmpSendEcho ;
publique
{Déclarations publiques}
fin;
procédure TMyPing.FormCreate(Expéditeur : TObject);
var
Données WSA : Données TWSA ;
hICMPdll : HMODULE ;
commencer
WSAStartup ($101, WSAData);
// Charge le contenu icmp.dll
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP := IcmpCreateFile;
StatusShow.Text := ';
StatusShow.Lines.Add('Délai de retour des octets de l'adresse IP de destination (millisecondes)');
fin;
Ensuite, il est temps d'effectuer le processus de programmation proprement dit de l'opération Ping comme indiqué ci-dessous.
procédure TMyPing.ExeBtnClick(Expéditeur : TObject);
var
IPOpt:TIPOptionInformation;//Options IP pour le paquet à envoyer
Adresse FIP : DWORD ;
pReqData,pRevData:PChar;
pIPE:PIcmpEchoReply;//Tampon de réponse d'écho ICMP
FTaille : DWORD ;
MaChaîne : chaîne ;
FTimeOut:DWORD;
Taille du tampon : DWORD ;
commencer
si PingEdit.Text <> ' alors
commencer
FIPAddress := inet_addr(PChar(PingEdit.Text));
FTaille := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(tuyau,BufferSize);
FillChar(tuyau^, SizeOf(tuyau^), 0);
pipe^.Data := pRevData;
MyString := 'Bonjour, Monde';
pReqData := PChar(MaChaîne);
FillChar(IPOpt, Taillede(IPOpt), 0);
IPOpt.TTL := 64 ;
FTimeOut := 4000 ;
IcmpSendEcho(hICMP, FIPAddress, pReqData, length(MyString), @IPOpt, pIPE, BufferSize, FTimeOut) ;
si pReqData^ = pIPE^.Options.OptionsData^ alors
commencer
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
fin;
FreeMem(pRevData);
FreeMem(tuyau);
fin
fin;
Grâce à la programmation ci-dessus, nous avons implémenté le fonctionnement de l'interface de la fonction Ping. En fait, il existe de nombreuses fonctions du protocole ICMP, qui peuvent être réalisées via des appels de fonction à Icmp.dll.