如何在golang中ping IP地址

Ous*_*ore 12 go

如何从golang应用程序ping IP地址?最终目标是检查服务器是否在线.

有没有办法在标准库中实现网络ping?

jpi*_*ora 15

正如@desaipath所提到的,在标准库中无法做到这一点.但是,您不需要为自己编写代码 - 它已经完成:

https://github.com/tatsushid/go-fastping

注意,发送ICMP数据包需要root权限

  • go-fastping 和 go-ping 都被放弃了(https://github.com/go-ping/ping/issues/221)。go-ping 的维护者建议 https://github.com/prometheus-community/pro-bing (2认同)

rip*_*pat 8

虽然不是真正的 ICMP ping,但这就是使用 TCP 协议探测我的服务器的用途:

    host := "example.com"
    port := "80"
    timeout := time.Duration(1 * time.Second)
    _, err := net.DialTimeout("tcp", host+":"+port, timeout)
    if err != nil {
        fmt.Printf("%s %s %s\n", host, "not responding", err.Error())
    } else {
        fmt.Printf("%s %s %s\n", host, "responding on port:", port)
    }
Run Code Online (Sandbox Code Playgroud)


d4n*_*yll 7

@jpillora 的回答建议使用go-fastping,但该库自 2016 年 1 月 8 日起未更新。这可能不是问题,因为 ping 的逻辑非常简单,但如果您想要更新的软件包,则有go-ping.


Kas*_*ski 5

我需要与您相同的东西,并且exec.Command为我的Raspberry Pi 做了一个变通办法(使用)来检查服务器是否在线。这是实验代码

out, _ := exec.Command("ping", "192.168.0.111", "-c 5", "-i 3", "-w 10").Output()
if strings.Contains(string(out), "Destination Host Unreachable") {
    fmt.Println("TANGO DOWN")
} else {
    fmt.Println("IT'S ALIVEEE")
}
Run Code Online (Sandbox Code Playgroud)