我一直在使用 go-ping 库进行非特权 ping,并在 golang 中计算各种网络统计数据。 代码片段为->
func (p *Ping) doPing() (latency, jitter, packetLoss float64, err error) {
timeout := time.Second*1000
interval := time.Second
count := 5
host := p.ipAddr
pinger, cmdErr := ping.NewPinger(host)
if cmdErr != nil {
glog.Error("Failed to ping " + p.ipAddr)
err = cmdErr
return
}
pinger.Count = count
pinger.Interval = interval
pinger.Timeout = timeout
pinger.SetPrivileged(false)
pinger.Run()
stats := pinger.Statistics()
latency = float64(stats.AvgRtt)
jitter = float64(stats.StdDevRtt)
packetLoss = stats.PacketLoss
return
}
它工作正常但现在开始抛出:- “监听 ICMP 数据包时出错:套接字:权限被拒绝”错误。 有人知道这背后的原因吗?我使用的Go版本是go1.7.4。
最佳答案
这是在您正在使用的库的 README.md 中:
此库尝试通过 UDP 发送“非特权”ping。在 Linux 上,这必须通过设置启用
sudo sysctl -w net.ipv4.ping_group_range="0 2147483647"
如果您不想这样做,您可以设置 pinger.SetPrivileged(true) 并使用 setcap 允许您的二进制文件使用 go-ping 绑定(bind)到原始套接字(或仅以 super 用户身份运行):
setcap cap_net_raw=+ep /bin/goping-binary
有关详细信息,请参阅此博客和 Go icmp 库。
希望对您有所帮助!
关于用于 golang 中非特权 ICMP ping 的 go-ping 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41423637/