Я пытаюсь пропинговать разные хосты одновременно, используя github.com/sparrc/go-ping
и горутины. Проблема в том, что кажется, что "статистика" распределяется между всеми горутинами. Это означает, что "статистика" имеет примерно одинаковое значение во всех горутинах. Для меня они должны быть экземпляром "статистики" для каждой горутины. Еще меня озадачивает то, что даже для несуществующего хоста в статистике есть значения. Я подумал, что, возможно, невозможно пропинговать несколько хостов с помощью ICMP из сокета, но, очевидно, я могу выполнить это из PowerShell.
Вот мой код:
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"} //this host doesn't exist
for _, s := range ips {
wg.Add(1)
go pingfunc(s)
}
wg.Wait()
}
Вывод:
&{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}