IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Pinger une liste d'IP. Quelle methode rapide ?


Sujet :

VB.NET

  1. #21
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 26
    Points
    26
    Par défaut
    Voilà c'est bon

    Si les 25 ip répondent, en 3 ou 4 secondes j'ai la réponse au ping.
    Si aucune des 25 ip ne repond, le timeout est de 2 secondes pour la tentative de connexion donc 2 secondes x 25 ip = 50 secondes d'attente.
    On peut peut être descendre le timeout à 1 seconde si cela ne fausse pas le ping...

    Voilà le code au complet pour ceux que ca interesse:
    Ps: j'ai ajouté une progresssbar.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    Imports System.Net.NetworkInformation
    Imports System.Threading
    Imports System.Text
     
    Public Class pinger
     
        Private Sub pinger_Load(sender As Object, e As System.EventArgs) Handles Me.Load
     
            LabelStatut.Text = ""
     
        End Sub
     
        Private Sub Listbox1_DrawItem(sender As System.Object, e As System.Windows.Forms.DrawItemEventArgs) Handles Listbox1.DrawItem
            Dim BackColor As Color = If(DirectCast(Listbox1.Items(e.Index), String).Contains("Connecté"), Color.Green, If(DirectCast(Listbox1.Items(e.Index), String).Contains("Déconnecté"), Color.Red, Color.Red))
            e.Graphics.FillRectangle(New SolidBrush(BackColor), e.Bounds)
            e.Graphics.DrawString(DirectCast(Listbox1.Items(e.Index), String), Listbox1.Font, New SolidBrush(Listbox1.ForeColor), e.Bounds.Left + 1, e.Bounds.Top + 1)
        End Sub
     
        Private Sub NsButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NsButton1.Click
     
            Listbox1.Items.Clear()
     
            LabelStatut.Text = "Ping des équipements en cours, veuillez patienter...."
     
            Dim SendPing As New Net.NetworkInformation.Ping
            Dim ResponseTime As Long
     
            ' Create a buffer of 32 bytes of data to be transmitted.
            Dim data As String = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
            Dim buffer As Byte() = Encoding.ASCII.GetBytes(data)
     
            ' Wait 10 seconds for a reply.
            Dim timeout As Integer = 2000
     
            ' Set options for transmission:
            ' The data can go through 64 gateways or routers
            ' before it is destroyed, and the data packet
            ' cannot be fragmented.
            Dim options As New PingOptions(64, True)
     
            Dim Result As Net.NetworkInformation.PingReply
     
            Dim serveurs As New List(Of String)()
     
            serveurs.Add("192.168.1.254")
            serveurs.Add("www.google.fr")
            serveurs.Add("www.pokemon.com")
            serveurs.Add("www.yahoo.fr")
            serveurs.Add("www.fisherlife.fr")
            serveurs.Add("www.gmail.com")
            serveurs.Add("www.gamekult.com")
            serveurs.Add("www.jeuxvideo.fr")
            serveurs.Add("www.jeuxactu.fr")
            serveurs.Add("www.lepoint.fr")
            serveurs.Add("www.rueducommerce.com")
            serveurs.Add("www.materiel.net")
            serveurs.Add("www.hamster-joueur.com")
            serveurs.Add("www.lepoint.fr")
            serveurs.Add("www.gameblog.fr")
            serveurs.Add("www.lemonde.fr")
            serveurs.Add("www.lequipe.fr")
            serveurs.Add("www.boulanger.fr")
            serveurs.Add("www.jeuxvideopc.com")
            serveurs.Add("www.jeuxvideo.org")
            serveurs.Add("www.lefigaro.fr")
            serveurs.Add("www.youtube.com")
            serveurs.Add("www.laredoute.fr")
            serveurs.Add("www.tf1.fr")
            serveurs.Add("www.melty.fr")
     
            Try
     
                If NsProgressBar1.Value = NsProgressBar1.Maximum Then
     
                End If
                NsProgressBar1.Minimum = 0
                NsProgressBar1.Maximum = 100
     
                Dim i As Integer
                For i = 0 To 100
                    NsProgressBar1.Value = i
                    Application.DoEvents()
                    System.Threading.Thread.Sleep(30)
                    Label164.Text = NsProgressBar1.Value.ToString() + "%"
                Next
     
                For Each serveur As String In serveurs
                    Result = SendPing.Send(serveur, timeout, buffer, options)
                    ResponseTime = Result.RoundtripTime
     
                    If Result.Status = Net.NetworkInformation.IPStatus.Success Then
                        Listbox1.Items.Add("Connecté       " & ResponseTime.ToString & "ms")
                    Else
                        Listbox1.Items.Add("Déconnecté")
                    End If
                Next
                LabelStatut.Text = "Ping terminé !"
     
            Catch ex As Exception
     
            End Try
     
        End Sub
     
     
    End Class

  2. #22
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    de quoi potasser un peu pour avoir plus d'ouverture d'esprit (pour le "pas dans un label" ^^)
    tous les pings en moins de 2 secondes :

    donc faire un nouveau projet, poser un flowlayoutpanel sur le form (pas trop petit le form) et lui mettre sa propriété autoscroll à true

    ensuite mettre le code ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    Public Class Form1
     
        Private Class MyPingInfo ' on créé une petite classe qui stocke les infos d'un serveur et s'occupe du ping
            Public Property Serveur As String ' ip ou nom
            Public Property PingEnCours As Boolean 'pas utilisé en fait mais on aurait pu
            Public Property LatenceMS As Integer? ' laissé à nothing si échec
     
            Private _mthToCallOnFinish As Action(Of MyPingInfo) ' méthode à appeler à la fin
     
            Public Sub New(adresse As String, mthToCallOnFinish As Action(Of MyPingInfo)) ' l'adresse et la méthode à appeler sont demandées par le constructeur (new)
                _mthToCallOnFinish = mthToCallOnFinish
                Me.Serveur = adresse
            End Sub
     
            Public Sub StartPing()
                Dim p As New System.Net.NetworkInformation.Ping
                AddHandler p.PingCompleted, AddressOf PingFini ' on s'abonne à l'evenement
                Me.PingEnCours = True
                p.SendAsync(Me.Serveur, 1500, Me) ' demande de ping asynchrone (c'est la méthode qui s'occupe de démarrer un thread)
            End Sub
     
            Private Sub PingFini(sender As Object, e As System.Net.NetworkInformation.PingCompletedEventArgs)
                RemoveHandler DirectCast(sender, System.Net.NetworkInformation.Ping).PingCompleted, AddressOf PingFini ' toujours se désabonner quand on a plus besoin
                Me.PingEnCours = False
                If e.Reply.Status = Net.NetworkInformation.IPStatus.Success Then
                    Me.LatenceMS = e.Reply.RoundtripTime
                End If
                _mthToCallOnFinish.Invoke(Me) ' appel de la méthode (la méthode est dans une variable, donc ici on ne la connait pas spécialement)
            End Sub
     
        End Class
     
        Private _Serveurs As New List(Of String) ' liste des serveurs à pinger
     
        Public Sub New()
            InitializeComponent()
     
            Me.Font = New System.Drawing.Font("Arial", 12, FontStyle.Bold)
     
            _Serveurs.Add("192.168.1.254")
            _Serveurs.Add("www.google.fr")
            _Serveurs.Add("www.pokemon.com")
            _Serveurs.Add("www.yahoo.fr")
            _Serveurs.Add("www.fisherlife.fr")
            _Serveurs.Add("www.gmail.com")
            _Serveurs.Add("www.gamekult.com")
            _Serveurs.Add("www.jeuxvideo.fr")
            _Serveurs.Add("www.jeuxactu.fr")
            _Serveurs.Add("www.lepoint.fr")
            _Serveurs.Add("www.rueducommerce.com")
            _Serveurs.Add("www.materiel.net")
            _Serveurs.Add("www.hamster-joueur.com")
            _Serveurs.Add("www.lepoint.fr")
            _Serveurs.Add("www.gameblog.fr")
            _Serveurs.Add("www.lemonde.fr")
            _Serveurs.Add("www.lequipe.fr")
            _Serveurs.Add("www.boulanger.fr")
            _Serveurs.Add("www.jeuxvideopc.com")
            _Serveurs.Add("www.jeuxvideo.org")
            _Serveurs.Add("www.lefigaro.fr")
            _Serveurs.Add("www.youtube.com")
            _Serveurs.Add("www.laredoute.fr")
            _Serveurs.Add("www.tf1.fr")
            _Serveurs.Add("www.melty.fr")
            _Serveurs.Add("www.fauxserveur.fr") ' pour avoir un rouge quand même
     
            For Each s In _Serveurs
                Dim p As New MyPingInfo(s, AddressOf PingFini) ' pour chaque serveur on créé une instance de notre petite classe, en lui donnant le serveur et l'adresse de la sub à appeler quand c'est fini
                p.StartPing() ' démarrage (ca aurait pu être implicite dans le sub new)
     
                Dim l As New Label With {.Text = p.Serveur, .Width = 300, .Margin = New System.Windows.Forms.Padding(2)} ' on créé un label on lui met son texte
                Me.FlowLayoutPanel1.Controls.Add(l) ' on ajoute le label dans le flowlayoutpanel
     
                _dico.Add(p, l) ' on créé un "lien" entre le label et la classe
            Next
        End Sub
     
        Private _dico As New Dictionary(Of MyPingInfo, Label) ' pour un pinginfo on définit quel est le label lié
     
     
        Private Sub PingFini(mpi As MyPingInfo)
            If mpi.LatenceMS.HasValue = False Then
                _dico(mpi).BackColor = Color.Red
                Exit Sub
            End If
     
            _dico(mpi).BackColor = Color.LawnGreen
            _dico(mpi).Text = mpi.Serveur & " " & mpi.LatenceMS.ToString & "ms"
        End Sub
     
    End Class

    la couleur est quelque chose à utiliser, ca permet de coder une info sans prendre de place, plutot que de marquer à côté "echec de connexion"
    d'ailleurs pour info un ping ne dit pas si la connexion est possible, un serveur peut refuser une requete ping s'il a autre chose à faire
    le mieux serait une connexion réelle (system.net.stockets.tcpclient) par contre ca ne dit pas le temps de liaison
    (et pinger plein de serveurs en même temps a une petite chance d'augmenter le temps de ping)

    après ici j'ai utilisé des labels, mais ca reste un peu moche, un usercontrol avec 2 labels (un ancré à gauche et un ancré à droite) serait mieux, on verrait les ping alignés à droite

    si vous avez des questions n'hésitez pas, si je vous mets ce code (qui est encore améliorable) c'est parce que c'est un peu la base de la POO en vb.net et que c'est très important de la comprendre pour avancer
    normalement il doit y avoir au moins une question sur le directcast(sender ... ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/01/2008, 17h07
  2. Imposer une methode Equals pour une recherche dans une List
    Par petozak dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 03/10/2006, 11h41
  3. Réponses: 2
    Dernier message: 08/09/2006, 10h00
  4. methode qui retourne une liste d'objets du meme type
    Par anoukhan dans le forum Oracle
    Réponses: 8
    Dernier message: 12/01/2006, 19h38
  5. [Regex][Avis] Méthode de suppression d'une liste de mots
    Par manal dans le forum Collection et Stream
    Réponses: 22
    Dernier message: 15/10/2005, 01h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo