33 lines
1.2 KiB
Go
33 lines
1.2 KiB
Go
|
// wrap7 project wrap7.go
|
||
|
package wrap7
|
||
|
|
||
|
import (
|
||
|
"net"
|
||
|
"time"
|
||
|
|
||
|
"github.com/go-ping/ping"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
PINGER_COUNT = 10 // Die Anzahl an Pings, die der Pinger zur Auswertung heranzieht. Pinger-Counts kosten richtig viel Zeit. Leider ist ein Ping alleine viel zu ungenau.
|
||
|
PINGER_TIMEOUT = "1000ms" // Sobald der Pinger innerhalb dieser Zeitspanne keinen Erfolg hat, liefert er 0ms Pingzeit und 100% Paketloss zur?ck.
|
||
|
PINGER_CRITICAL_LOSS_PERCENT = 100
|
||
|
)
|
||
|
|
||
|
func pingMyDing(myIp net.IP) (time.Duration, float64) { //Die Konversion zu net.Ip ist eigentlich überflüssig, die Limitierung des Typs an der Schnittstelle erspart aber nachgelagerte Plausibilitätsprüfungen.
|
||
|
pinger, err := ping.NewPinger(myIp.String())
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
pinger.Count = PINGER_COUNT
|
||
|
pinger.Timeout, _ = time.ParseDuration(PINGER_TIMEOUT)
|
||
|
//pinger.Interval, _ = time.ParseDuration(PINGER_INTERVAL)
|
||
|
|
||
|
//sudo sysctl -w net.ipv4.ping_group_range="0 2147483647"
|
||
|
pinger.SetPrivileged(false)
|
||
|
pinger.Run() // blocks until finished
|
||
|
stats := pinger.Statistics() // get send/receive/rtt stats
|
||
|
return stats.AvgRtt, stats.PacketLoss
|
||
|
}
|