如何同时对多个主机进行ping

问题描述 投票:0回答:1

我正在尝试使用github.com/sparrc/go-ping和goroutines同时ping通各种主机。问题是似乎所有goroutine之间都共享“统计信息”。这意味着“状态”在所有goroutine中的值都大致相同。对我来说,它们应该成为每个goroutine的“ stats”实例。令我感到困惑的是,即使对于一个不存在的主机,统计数据中也包含着价值。我在想可能无法从套接字使用ICMP对多个主机执行ping操作,但是显然我能够从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}
sockets go networking ping icmp
1个回答
0
投票

看到这个example

在您的示例中,您具有OnFinish回调。但是您将有另一个回调可用,即OnRecv

如果收到响应,它将调用“ OnRecv”回调。完成后,它将调用“完成”回调。

因此,对于不存在的主机,如GoDoc所述:

  1. [Statistics表示当前正在运行或已完成的pinger操作的统计信息。
  2. [Packet代表已接收和处理的ICMP回送数据包。

您需要从Packet结构中选择统计信息,如示例中所示,用于接收到的ICMP回显数据包。因此,请遵循示例;你会很高兴!

© www.soinside.com 2019 - 2024. All rights reserved.