Comment envoyer une requête ICMP ping en Visual Basic ?
La commande Ping permet d'envoyer une requête particulière (ICMP 'Echo') vers une autre machine. Un ping permet de déterminer si la communication avec une machine distante est possible ou non. A noter qu'un ping peut échouer, si la machine distante est équipé d'un firewall (logiciel ou matériel) qui rejette volontairement les requêtes ICMP (en entrée ou en sortie), pour éviter certains types d'attaques. A noter également qu'on peut utiliser ping sur l'adresse 127.0.0.1 (appelée également "loopback" ou boucle réseau locale) pour tester simplement si TCP/IP est installé et opérationnel. Enfin, le résultat d'un ping permet de connaître, en cas de succès, le temps de réponse de la machine distante. VB ne permet pas directement de faire un ping, il n'existe pas de "commande" dédiée. Mais il est bien sûr possible de le faire en utilisant différentes méthodes : - Utilisation des API des librairies socket et ICMP
- Récupération des informations de la commande ping d'une session Dos
Utilisation des APILa méthode présentée ici repose sur l'utilisation de la librairie ICMP. Sans être complexe, cette méthode nécessite un bon nombre de déclarations de constantes et fonctions de l'API Windows. Cet article est présent dans la KB Microsoft : Comment exécuter un ping sur une adresse IP avec Visual Basic en utilisant ICMP Récupération des informations de ping d'une commande DosDans l'article 152 - Comment lancer un programme de façon synchrone depuis un programme VB?, nous avons implémenté la fonction "ShellWait" qui permet de lancer un programme et d'attendre la fin de son exécution. Cette fonction nous permettra d'exécuter Ping dans une invite de commande. On s'assurera que la sortie de cette commande soit redirigée vers un fichier qui sera à son tour interprété, afin de déterminer le succès ou l'échec de l'opération. Cette méthode a un inconvénient de taille : le résultat de la commande ping dépend des options régionales du système installé. Par exemple, selon que le système est en français ou en anglais, le texte renvoyé sera différent. Cette méthode devra donc être adaptée en fonction de la langue de l'OS. Toutefois, du fait de sa grande simplicité, cette méthode mérite d'être évoquée, ne serait-ce qu'à titre d'exemple. Le programme exemple suivant implémente très sommairement une fonction Ping de notre crû, en utilisant ShellWait : Private Function pingDos(ByVal adr As String, ByRef AvgTime As Long) As Boolean Dim ret As Boolean Dim batchCmd As String Dim tmpBatch As String Dim f As Integer Dim tmpResult As String Dim avgPattern As String Dim buffer As String Dim p1 As Long
tmpResult = App.Path & "\pingres.txt" tmpBatch = App.Path & "\tmpBatch.bat" batchCmd = "ping " & adr & " > " & tmpResult avgPattern = "Moyenne = " f = FreeFile Open tmpBatch For Output As #f Print #f, batchCmd Close #f ret = ShellWait(tmpBatch) If ret Then f = FreeFile Open tmpResult For Binary As #f buffer = Space$(LOF(f)) Get #f, , buffer Close #f p1 = InStr(buffer, avgPattern) If p1 Then AvgTime = Val(Mid$(buffer, p1 + Len(avgPattern))) pingDos = True Else pingDos = False End If Else pingDos = False End If
End Function
Dim szAdress As String Dim ret As Boolean, averageTime As Long
szAdress = "www.google.com" ret = pingDos(szAdress, averageTime) If ret Then MsgBox "Ping réussi sur " & szAdress & " temps moyen = " & averageTime, vbInformation Else MsgBox "Echec de ping sur " & szAdress, vbExclamation End If A noter qu'il serait plus correct d'écrire les fichiers temporaires utilisés dans le répertoire ad-hoc, comme expliqué en détail dans l'article "85 - Commente retrouver le dossier temporaire de Windows?", au lieu d'écrire dans App.path comme nous faisons ici afin de ne pas alourdir ce code d'exemple, ou d'utiliser les flux standards de ligne de commande pour n'avoir à utiliser aucun fichier. La commande ping est un outil permettant aisément de déterminer si la communication entre deux ordinateurs est possible. C'est pourquoi cet outil est souvent utilisé en premier lieu, vers un site web à haute disponibilité, de sorte à déterminer la connectivité au web. Par exemple, c'est le cas pour www.yahoo.com ou www.google.com. Néanmoins, si cette connectivité est garantie en cas de succès de la requête ping, son échec ne signifie pas forcément qu'aucun accès Internet n'est disponible. Parmis les causes possibles, le serveur distant peut refuser la réponse au ping (c'est le cas de www.microsoft.com), la machine locale peut refuser les requêtes ping sortantes et des problèmes de DNS, de passerelle ou d'interface réseau peuvent survenir durant l'opération. Cette technique est donc à utiliser avec précautions ! Il est aussi à remarquer une requête appropriée au service DNS peut apporter plus d'information sur l'origine d'un problème qu'un simple ping. On trouve parfois des implémentations qui simulent un "ping" en effectuant une requête HTTP/POP/SMTP vers ce genre de serveurs à haute disponibilité. Ces protocoles ne sont pas adaptés à cet usage et les dévoyer ainsi n'est pas nécessairement une bonne idée. En tout état de cause, si on doit développer une solution de ce type, on veillera à le faire après avoir pris connaissance des protocoles sous-jacents : le protocole HTTP, le protocole SMTP, le protocole POP3. Pour aller plus loin Voir aussi : |