Как пинговать несколько хостов одновременно - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь пропинговать разные хосты одновременно, используя 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}

1 Ответ

0 голосов
/ 29 мая 2020

См. Этот пример

В вашем примере у вас есть обратный вызов OnFinish. Но вы бы могли использовать другой обратный вызов, например, OnRecv.

Если он получает ответ, он вызывает обратный вызов «OnRecv». По завершении он вызывает функцию обратного вызова Fini sh.

Итак, для несуществующего хоста GoDo c говорит:

  1. Statistics представляют статистику текущей запущенной или завершенной операции пингера.
  2. Packet представляет полученный и обработанный эхо-пакет ICMP.

Вам необходимо выбрать статистика из структуры пакета, как показано в примере для полученных эхо-пакетов ICMP. Итак, следуем примеру; вам будет хорошо go!

...