当前位置: 首页 > 面试题库 >

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

宗政昱
2023-03-14
问题内容

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


问题答案:

确保您的设置没有任何改变。如果我事先根据Github的说明设置了net.ipv4.ping_group_range,则在32位Ubuntu Go 1.7.4(linux /
386)的Ubuntu 16.04上仍然可以使用包中的 ping 命令。

关于Linux支持的注意事项:

该库尝试通过UDP发送“非特权” ping。在Linux上,必须通过设置启用

sudo sysctl -w net.ipv4.ping_group_range="0 2147483647"

如果您不希望这样做,则可以设置pinger.SetPrivileged(true)并使用setcap以允许您的二进制文件使用go-
ping绑定到原始套接字(或仅以超级用户身份运行):

setcap cap_net_raw=+ep /bin/goping-binary

有关更多详细信息,请参见此博客 和Go
icmp库



 类似资料:
  • 问题内容: 答案通常归结为“使用具有root特权的第三方模块”或“使用系统的ping命令并解析输出”。在本地方法中,icmplib和M. Cowles和J. Diemer的ping.py 明确提到了对root特权的需求,以及scapy 手册。 因此,从这一方面来说,在本地发送没有特殊特权的ICMP ping似乎是不可能的。system ping命令确实以某种方式进行管理,但其手册页并未说明如何进行

  • 问题内容: sql.Open()返回* sql.DB类型的变量 我有一个函数可以调用其他10个都需要进行数据库调用的函数 是否更正确/更有效: 发送* sql.DB指针到每个函数,或 在每个函数中创建一个新的* sql.DB对象 含义 要么 我问的原因是因为我当前正在向每个函数发送指针,而我的驱动程序似乎坏了。我正在使用http://code.google.com/p/odbc,这使我相信每个功能

  • 问题内容: 以下代码在Go 1.6或1.7中生成语法错误( 语句结尾 出现 意外的++ ): 这不应该被允许吗? 问题答案: 这是一个错误,因为Go中的and 是语句,而不是表达式:Spec:IncDec语句(并且语句没有要返回的结果)。 有关推理的信息,请参阅Go常见问题解答:为什么++和-语句而不是表达式?为什么使用后缀而不是前缀? 如果不使用指针算法,则前缀和后缀增量运算符的便利性值会下降。

  • 问题内容: 我遇到了一个有趣的问题,即,即使自第一次尝试以来数据库已被杀死,db.Ping()也不返回错误。 源代码如下: 首先,数据库已启动,因此第一个Ping成功。但是,我只是为了进行测试而在其中延迟了一下。在那15秒内,我停止了数据库(),但是db.Ping()仍然成功。 如果我要执行任何实际的查询(通过,或),那么SQL包将与断裂的管道(预计)恐慌。 难道我做错了什么? 还:go版本go1

  • 问题内容: 我正在尝试为视图创建JPA实体。在数据库层中,表和视图应该相同。 但是,问题开始出现并且有两个方面: 尝试设置正确的注释时。视图没有与之关联的主键,但是如果没有对字段进行适当的注释,则会在运行时引发抛出异常。 Spring Boot 接口定义要求类型为extends ,这避免了由于视图实体上缺少ID 而不能用作替代方法。 与缺少主键的视图进行交互的正确JPA / SpringBoot

  • 问题内容: 是否可以使用Go创建共享库(.so)? 更新 :为此创建了一个“ 问题 ”。 问题答案: 现在可以使用标志 您需要做的是首先运行以下命令: (以上代码使所有通用软件包都可共享!)然后 最后,在编译代码时,您需要运行: 上面这些就是什么,而不是静态链接所有内容而仅动态链接它们,您最终将获得更小的编译文件。为了让您了解我的带有静态链接的“ hello.go”文件为2.3MB,而使用动态链接