3 votes

Comment "pinger" plusieurs hôtes en même temps

Je tente de pinguer différents hôtes en même temps en utilisant github.com/sparrc/go-ping et des goroutines. Le problème est qu'il semble que "stats" est partagé entre toutes les goroutines. Cela signifie que "stats" a approximativement la même valeur dans toutes les goroutines. Pour moi, il devrait y avoir une instance de "stats" pour chaque goroutine. Ce qui me trouble également, c'est qu'il y a des valeurs dans "stats" même pour un hôte qui n'existe pas. Je pensais peut-être qu'il n'était pas possible de pinguer plusieurs hôtes en utilisant ICMP à partir d'un socket, mais évidemment je suis capable de le faire depuis PowerShell.

Voici mon code:

package main

import (
    "fmt"
    "sync"

    "github.com/sparrc/go-ping"
)

var wg sync.WaitGroup

func pingfunc(ip string) {
    defer wg.Done()
    pinger, err := ping.NewPinger(ip)
    pinger.SetPrivileged(true)

    if err != nil {
        panic(err)
    }
    pinger.Count = 3

    pinger.OnFinish = func(stats *ping.Statistics) {
        fmt.Println(stats)
    }
    pinger.Run() // blocks until finished
}

func main() {
    ips := [4]string{"172.26.236.3",
        "172.26.236.5",
        "172.26.236.10",
        "172.26.2.20"} //cet hôte n'existe pas
    for _, s := range ips {
        wg.Add(1)
        go pingfunc(s)
    }
    wg.Wait()

}

Sortie:

&{3 2 -50 172.26.236.3 172.26.236.3 [12.9656ms 12.9656ms 11.9679ms] 11.9679ms 12.9656ms 12.633033ms 470.32µs}
&{3 2 -50 172.26.236.10 172.26.236.10 [12.9656ms 12.9656ms 11.9679ms] 11.9679ms 12.9656ms 12.633033ms 470.32µs}
&{3 3 0 172.26.2.20 172.26.2.20 [12.9656ms 14.9603ms 17.166ms] 12.9656ms 17.166ms 15.030633ms 1.715527ms}
&{3 3 0 172.26.236.5 172.26.236.5 [12.9656ms 14.9603ms 17.166ms] 12.9656ms 17.166ms 15.030633ms 1.715527ms}1.850632ms}

0voto

shmsr Points 2230

Consultez cet exemple

Dans votre exemple, vous avez le callback OnFinish. Mais vous avez également un autre callback disponible, à savoir OnRecv.

S'il reçoit une réponse, il appelle le callback "OnRecv". Lorsque c'est terminé, il appelle le callback "Finish".

Donc, pour l'hôte inexistant, comme le dit la documentation GoDoc:

  1. Statistics représentent les statistiques d'une opération de ping en cours ou terminée.
  2. Packet représente un paquet ICMP echo reçu et traité.

Vous devez extraire les statistiques de la structure Packet comme indiqué dans l'exemple pour les paquets ICMP echo reçus. Donc, suivez l'exemple; vous serez bien parti!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X