如何在golang中ping一个IP地址

slmsl1lt  于 2023-05-11  发布在  Go
关注(0)|答案(7)|浏览(165)

如何从golang应用程序ping IP地址?最终目标是检查服务器是否在线。
go在标准库中有办法实现网络ping吗?

iq0todco

iq0todco1#

正如@desaipath提到的,在标准库中没有办法做到这一点。但是,您不需要自己编写代码-它已经完成了:
https://github.com/tatsushid/go-fastping

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

deyfvvtc2#

我需要和你一样的东西,我已经为我的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")
}
rseugnpd

rseugnpd3#

虽然不是真实的的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)
    }
fhg3lkii

fhg3lkii4#

@jpillora的answer建议使用go-fastping,但该库自2016年1月8日以来一直没有更新。这可能不是一个问题,因为ping的逻辑非常简单,但如果你想要一个更新的软件包,那么就有go-ping

ss2ws0br

ss2ws0br5#

没有

Go没有任何内置的方法来ping标准库中的服务器。你需要自己写代码。
您可以查看icmp section of golang library。并使用此控制消息列表,正确构造icmp消息。
但是,请记住,一些服务器管理员出于安全原因关闭了他们服务器上的ping服务。所以,如果你的目标是最终检查服务器是否在线,这不是100%可靠的方法.

q1qsirdb

q1qsirdb6#

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

y1aodyip7#

不幸的是,由于缺乏维护人员和访问权限,go-ping库在2023年1月22日之后不再维护。有一个新的活跃维护的分支:pro-bing

相关问题