How to ping an IP Address in golang

时间:2015-08-07 02:09:19

标签: go

How can you ping an IP address from a golang application? The ultimate goal is to check if a server is online.

Does go have a way in the standard library to implement a network ping?

6 个答案:

答案 0 :(得分:14)

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

  

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

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

答案 1 :(得分:5)

我需要和你一样的东西,我已经为我的Raspberry Pi做了一个解决方法(用exec.Command)来检查服务器是否在线。这是实验代码

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")
}

答案 2 :(得分:4)

Go没有任何内置方法来ping标准库中的服务器。 你需要自己编写代码。

为此,您可以查看icmp section of golang library。并使用this list of control messages来正确构造icmp消息。

但是,请记住,某些服务器管理员会因安全原因而关闭其服务器上的ping服务。因此,如果您的目标是最终检查服务器是否在线,则这不是100%可靠的方法。

答案 3 :(得分:4)

尽管不是真正的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)
    }

答案 4 :(得分:3)

@jpillora的answer建议使用go-fastping,但是该库自2016年1月8日以来就没有进行过更新。由于ping的逻辑非常简单,所以这可能不是问题,但是如果您想要一个更新的软件包,然后是go-ping

答案 5 :(得分:1)

package main

import (
  "fmt"
  "os/exec"
)

func main() {
  Command := fmt.Sprintf("ping -c 1 10.2.201.174 > /dev/null && echo true || echo false")
  output, err := exec.Command("/bin/sh", "-c", Command).Output()
  fmt.Print(string(output))
  fmt.Print(err)
}