Delphi utilise ICMP pour détecter si l'hôte distant est vivant
2005-03-10 JLBNET
Dans la communication réseau, il est souvent nécessaire de déterminer si l'hôte distant est vivant pour déterminer l'opération effectuée dans la partie suivante. Il peut être implémenté directement à l'aide du protocole ICMP, mais de nombreux détails de protocole doivent être pris en compte, ce qui est plus gênant à mettre en œuvre. Il existe des fonctions prêtes à l'emploi dans la bibliothèque ICMP qui est livrée avec Windows, remplissez simplement la structure de données correspondante avant utilisation.
Ce qui suit est la structure de données à utiliser. Ces structures MSDN ont des déclarations sous forme C, et la forme de Delphi est donnée ici.
// La structure des données du protocole utilisé
PipoPtionInfo = ^ TipOptionInfo;
TipOptionInfo = enregistrement emballé
Ttl: octet; // la vie
TOS: octet; // type de service, type de demande
Drapeaux: octet; // loterie
Optionssize: octet; // Longueur d'option
OptionsData: Données PCHA; // Options
fin;
Picmpechoreply = ^ ticmpechoreply;
TicMpeChorePly = Enregistrement emballé // ICMP Retour Informations
Adresse: DWORD; // Adresse IP
Statut: DWORD; // Statut
RTT: DWORD;
DataSize: Word; // longueur de données
Réservé: mot; // réserve
Données: pointeur; // données
OPTIONS: TIPOPTIONInfo; // zone d'options
fin;
// Déclaration de fonction dans la bibliothèque dynamique
TicMPcreateFile = Fonction: Thandle;
TicMpCloseHandle = Fonction (ICMPhandle: Thandle): Boolean;
TicMPSendEcho = fonction (icmphandle: thandle; destinationAddress: dword;
RequestData: Pointer;
RépondreBuffer: Pointer; Réponse: DWORD;
// La déclaration variable à utiliser
Hicmpdll, hicmp: thandle;
Wsadata: Twsadata;
ICMPCreateFile: TicMPCreateFile;
ICMPCloseHandle: TicMpCloseHandle;
ICMPSENDECHO: Ticmpendecho;
// Destip: L'adresse distante à détecter est 192.168.1.1
Procédure f_checkonline (Destip: String);
var
IPOPT: TipOptionInfo; // Package Options IP
IPaddr: dword;
preqdata, prevdata: phar;
Pipe: picmpechoreply; // ICMP Echo Répondre tampon
Fsize: dword;
MyString: String;
FTimeout: dword;
BufferSize: DWORD;
I: entier;
Commencer
HicMpdll: = LoadLibrary ('ICMP.DLL'); // Cliquez sur la bibliothèque dynamique ICMP
Si Hicmpdll <> null alors
Commencer
Wsastartup (101 $, wsadata); // initialiser la pile de protocole réseau
@Icmpcreatefile: = getProcaddress (HicMpdll, 'icmpcreateFile'); // s'il vous plaît la fonction d'exportation dans la bibliothèque dynamique
@IcmpcloseHandle: = getProcaddress (HicMpdll, 'icmpccloseHandle');
@Icmpendecho: = getProcAddress (hicmpdll, 'icmpendecho');
HicMP: = ICMPCreateFile; // Créer une poignée ICMP
IPaddr: = INET_ADDR (PCHAL (DESTIP)); // Obtenez de la détection de l'adresse IP de l'hôte distant
Fsize: = 40;
BufferSize: = sizeof (ticmpechoreply) + fsize;
GetMem (prevdata, fsize);
GetMem (tuyau, tamponze);
Fillchar (tuyau ^, sizeof (tuyau ^), 0);
tuyau ^ .data: = prevData;
MyString: = 'Salut, en ligne?'; // chaîne arbitraire
preqdata: = pChar (mystring);
FillChar (ipopt, sizeof (ipopt), 0);
Ipopt.ttl: = 64;
FTimeout: = 500; // Temps d'attente
i: = icmpendecho (HICMP, iPaddr, preqdata, longueur (mystring), @ipopt, tuyau, tamponze, ftimeout); // s'il y a un retour, la valeur de retour indique le nombre de réponses reçues. Si 0 signifie aucune réponse, l'hôte ne peut pas atteindre
Freemem (Prevdata);
FreeMem (tuyau);
ICMPCloseHandle (HICMP);
FreeLibrary (HicMPDLL); // Library de publication
Wsacleanup (); // nettoyer la pile de protocole
fin;
fin;