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}