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

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

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.