[.net2] tester l'interconnection à internet (par icmp traceroute)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 640 fois - Téléchargée 20 fois

Contenu du snippet

Ce bout de code sous forme de class permet de verifier si nous avons acces à internet.
Principe de fonctionnement :
1 - effectuer une requete ping avec un ttl qui s'accremente vers une ip public routable (par default un serveur root dns)
2 - on teste à chaque fois si nous avons une ip public (celui du routeur qui répond)
3 - dès qu'un routeur public répond, cela veut dire que la connection internet est active

Avantage de cette source par rapport au autre methode genre ping simple:
si le serveur de destination (ici 212.27.48.10) n'est plus joignable (serveur down par exemple, changement de regle du firewall (desactivation au reponse ICMP), changement d'adresse IP fixe...) nous pouvons néanmoins savoir si oui ou non nous somme bien connecté sur le net ;)

Ce bout de code est publié sous licence GPL V2.

Source / Exemple :


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Test Internet connection
' Version 0.1
' 
' Copyright (c) 2007 Nicolas GOLLET ( ng (at) kisecure (dot) com )
' Copyright (c) 2007 Kisecure SARL
'
' This program is free software. You can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation; either version 2 of the License.
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' DEBUT DE LA CLASS

Imports System.Net
Imports System.Net.NetworkInformation
Imports System.Text
Imports System.Text.RegularExpressions

Public Class class_ki_internetenabled
    ' Class de test pour savoir l'état de la connection internet
    ' par default time to live = 10 (10 sauts max, donc on passe par 10 routeurs)
    '             timeout = 300 ms donc, la fonction prend : 10*300ms = 3 secondes.

    ' fonction permettant de savoir si le string passé en argument est une adresse
    ' ip Public : si public la fonction retourne True, si privé la fontion retourne False

    ' def de variable de la class
    ' objet ping
    Private ping As New System.Net.NetworkInformation.Ping()
    ' option de l'objet ping
    Private options As New PingOptions()
    ' data qui seront envoyés
    Private data As String = "traceroute"
    ' objet de la reponse du ping
    Private reply As PingReply

    Dim finished As Boolean = False

    Private Function validip(ByVal ip As String) As Boolean

        ' verification que l'ip est dans ces plages :
        '    * 10.0.0.0 ? 10.255.255.255 (10/8)
        '    * 172.16.0.0 ? 172.31.255.255 (172.16/12)
        '    * 192.168.0.0 ? 192.168.255.255 (192.168/16)
        ' par expression régulière.

        ' def expression régulière
        Dim oRegex As New Regex("^(10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})|(192\.168\.[0-9]{1,3}\.[0-9]{1,3})|(172\.(16|17|18|19|2[0-9]{1}|30|31)\.[0-9]{1,3}\.[0-9]{1,3})$")
        Try
            ' on check avec la regex
            If oRegex.IsMatch(ip) Then
                'ip privé
                validip = False
            Else
                'ip public
                validip = True
            End If
        Catch ex As Exception
            ' si on obtient une erreur
            validip = False
        End Try
    End Function

    Public Function testconnection(Optional ByVal s_IP As String = "192.36.148.17", Optional ByVal i_TTL As Integer = 10, Optional ByVal i_timeout As Integer = 300) As Boolean

        ' par default : ip => 192.36.148.17 (i.root-servers.net)
        finished = False
        options.Ttl = 1

        Try ' normalement il n'y peut pas y avoir d'erreur
            Do Until ((finished = True) Or (options.Ttl >= i_TTL))
                ' envoi du ping avec les options ttl

                reply = ping.Send(s_IP, i_timeout, Encoding.ASCII.GetBytes(data), options)
                ' si le routeur ne répond pas au ping (ca arrive ;) )
                If (reply.Status = IPStatus.TtlExpired) Or (reply.Status = IPStatus.TtlReassemblyTimeExceeded) Then
                    ' verification si ip public
                    If validip(reply.Address.ToString()) Then
                        ' on obtient une ip public
                        finished = True
                    End If
                End If
                ' on accrémente le ttl :)
                options.Ttl = options.Ttl + 1
            Loop
            If finished = True Then
                Return True
            Else
                Return False
            End If
        Catch ex As Exception
            Return False
        End Try

    End Function

    Public Sub New()
        ' option du ping Definition du TTL par default et du mode de fragmentation
        options.DontFragment = True
        options.Ttl = 1
    End Sub

End Class
' FIN DE LA CLASSE

' EX UTILISATION :
' une form vierge avec un labeltext nom : label1
'        Dim internettest As New class_ki_internetenabled
'        If (internettest.testconnection = True) Then
'            Label1.Text = "Votre connection internet est opérationnel"
'        Else
'            Label1.Text = "Votre connection internet n'est pas opérationnel"
'        End If

Conclusion :


Toutes vos remarques sont les bienvenues :)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
8
Date d'inscription
lundi 2 juillet 2007
Statut
Membre
Dernière intervention
3 juillet 2007

tout dépend le besoin que l'on a du script, afin d'être démocratique je dirais que des utilisateurs trouverons surement leur bonheur avec les différentes possibilités que nous avons proposés toi et moi. Le choix que j'ai fait d'utiliser l'incrémentation de TTL et la détection de la première IP publique était justifiée dans mon projet et je pense que certains développeurs (peut etre pas VB) trouverons une utilité. L'utilisation d'une regex est très rapide et ne laisse pas le temps au sablier d'apparaitre (sauf peut etre sur un WinXP/486dx ;) lol ).


Cordialement,
Nicolas
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
Un connect() sur MS et Google ne suffit pas à savoir si on est branché au net ?
Semble très bien passer partout où on l'a mise avec nos produits.

Que ne soit pas en .net mais c'est tant mieux pour l'utilisateur, un interprété est fait pour utiliser des composants, surtout pas autre chose sinon c'est sablier en permanence.
Messages postés
8
Date d'inscription
lundi 2 juillet 2007
Statut
Membre
Dernière intervention
3 juillet 2007

Très bien mais ce n'est pas du vb.net donc. Nous somme ici sur un site qui parle de Visual Basic... effectivement si on développe dans d'autre langage les performances peuvent être mieux optimisé. Chaque langage a ses avantages et inconveniants. Prenons l'exemple de Fr08, 64ko la demo de plusieurs minutes dev en asm ;) peut on faire de meme en vb.net? reponse NON :)
Mais une personne qui veux faire que du VB et ne connait que ca pourra grace a ce bout de code faire ce test, effectivement c'est lourd dû au langage... mais on peut tj faire une transcryption de l'idée en un autre language...

Mais le soussis principal c'est que ta dll (bnConn.dll) je suppose ne fait pas la meme chose que mon bout de code...
toi tu fais quoi?
Et bien c'est simple apparement en analysant cette DLL tu test des connections vers des sites connus (microsoft.com et google.com) :
soucis :
1 - Si ces site ne reponde plus pour une raison ou une autre (problème de route vers ces sites, filtrage vers ce site, dns, etc...) ton programme repond: pas d'internet!
2 - Si les entrées dns ne sont pas valide ou que le serveur dns est HS ou mal configuré, ta dll repond pas d'internet!

2.5ko oui mais qui fait pas grand chose!

Le but de mon extrait de code est de montrer un moyen de tester une connection sans pour autant faire appel a des protocoles spécifiques, mais n'utiliser que le minimum. Ainsi en cas d'erreur eventuelle de configuration DNS, du fichiers hosts, d'un serveur qui changerait de politique en ne répondant plus au PING, ma solution reste efficace car ce sont les routeurs internet qui répondent et eux ne peuvent en aucun cas ne pas renvoyer de messages ICMP car c'est leur rôle (cf ccm :p ) de renvoyé des message ICMP (comme tu le sais la valeur TTL que j'incrémente permet d'éviter d'avoir des packet qui se baladerait infiniment sur le net.)
Si tu peux me garantir que ta dll ne fera jamais d'erreur je serais admiratif, car en modifiant mon fichiers hosts (pense a flusher ton cache DNS) j'ai pu voir que je n'avais plus de connexion internet en y rajoutant 2 lignes !

Dans le cas ou tu developperais une appli qui test les options réseaux, il convient de vérifier le bon fonctionnement du routage IP avant la config DNS :p

Cordialement
nicolas
Messages postés
939
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
27 janvier 2009
1
HVB : effectivement on utilise le ping... donc le protocole ICMP qui est le protocole de controle d'internet. Je ne vois pas d'autre moyen simple pour effectuer ce test....

C'est bien ce qu'on dit. Test de connexion internet? Ping! Pas vraiment besoin de source pour ça...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
Te fache pas, ces lourdeurs sont inhérentes aux interprétés, je ne t'ai pas mis en cause.
Ma solution est dans une dll de 2.5 Ko dont j'ai fourni le lien.
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.