用于 golang 中非特权 ICMP ping 的 go-ping 库

标签 go

我一直在使用 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/

相关文章:

function - 在 Go 中将函数作为参数传递

go - 删除 slice 中的元素

git - 无法从 git 获取对 git post-update Hook 的依赖

go - 如何在golang中获取调用者参数字符串?不可能吗?

json - Marshal []byte 到 JSON,给出一个奇怪的字符串

带分页处理的 Golang 网络蜘蛛

MongoDB(Mgo v2)投影返回父结构

go - 执行 "go get path/to/myapp"时我可以获得正确的版本和构建信息吗?

node.js - 基本客户端/服务器架构和交互

windows - TerminateProcess() 返回 EINVAL