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?
答案 0 :(得分:14)
正如@desaipath所提到的,在标准库中无法做到这一点。但是,您不需要自己编写代码 - 它已经完成了:
注意,发送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)
}