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 :)
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.