Astuces de recherche...
Home
- Accueil & nouveautés
- Les newsgroups VB
- Téléchargements
- L'équipe
- Nous contacter
- Liens
Rubriques
- Toutes les questions
- Affichage & graphismes
- Algorithmique
- API
- Base de registre
- Bases de données
- Contrôles
- Date & heure
- Déploiement
- Divers
- Erreurs & problèmes
- Fichiers & dossiers
- Généralités
- Impression
- Internet & mails
- Math
- Multimédia
- Réseaux
- Structures de données
- Texte & strings
- VB .Net
- VB Script
- VBA
- Windows

Question 166

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 API

La 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 Dos

Dans 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

'
' Exemple d'utilisation
'
    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 :

Date de publication : 13 septembre 2007
Dernière modification : 13 septembre 2007
Rubriques : Internet & mails, Réseaux
Mots-clés : ping, ICMP, présence, ordinateur, connection, test connection, connecter