golang 实现ping 命令

本文介绍了一个用于检测IP是否可用的Go语言库——go-ping。通过发送ICMP请求并分析返回的统计数据,可以判断目标IP的可达性和响应时间。库提供了丰富的ICMP信息,包括收发包数、丢包率、平均往返时间等,适用于多种网络监控场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中,我们需要知道哪些IP是可用IP,这时候想到了用ICMP(Internet控制报文协议)。于是就在网上查找,后来找到了一个开源库–github.com/sparrc/go-ping。这个库简单好用,能达到项目需求,也推荐大家使用。
贴一个示例吧.(当然你得先 go get github.com/sparrc/go-ping 库)。

func ServerPing(target string) bool  {
	pinger, err := ping.NewPinger(target)
	if err != nil {
		panic(err)
	}

	pinger.Count = ICMPCOUNT
	pinger.Timeout = time.Duration(PINGTIME*time.Millisecond)
	pinger.SetPrivileged(true)
	pinger.Run()// blocks until finished
	stats := pinger.Statistics()

	fmt.Println(stats)
	// 有回包,就是说明IP是可用的
	if stats.PacketsRecv >= 1 {
		return true
	}
	return false
}

这里是通过回包数量来判断的,也可以通过掉包率来判断。同时,该库提供了Statistics结构体,包含了详细的ICMP信息,如下

type Statistics struct {
	// PacketsRecv is the number of packets received.
	PacketsRecv int

	// PacketsSent is the number of packets sent.
	PacketsSent int

	// PacketLoss is the percentage of packets lost.
	PacketLoss float64

	// IPAddr is the address of the host being pinged.
	IPAddr *net.IPAddr

	// Addr is the string address of the host being pinged.
	Addr string

	// Rtts is all of the round-trip times sent via this pinger.
	Rtts []time.Duration

	// MinRtt is the minimum round-trip time sent via this pinger.
	MinRtt time.Duration

	// MaxRtt is the maximum round-trip time sent via this pinger.
	MaxRtt time.Duration

	// AvgRtt is the average round-trip time sent via this pinger.
	AvgRtt time.Duration

	// StdDevRtt is the standard deviation of the round-trip times sent via
	// this pinger.
	StdDevRtt time.Duration
}

非常丰富的ICMP信息,足够应付多种应用场景。个人感觉这个库非常棒,在这里mark一下。

### 在命令行中执行持续的 Ping 检测 在 Windows 和 Linux 系统中,`ping` 命令可以用于持续检测网络连通性。通过特定的命令参数,可以实现长时间的持续 `ping` 操作。 #### Windows 系统中的持续 Ping 检测 在 Windows 系统中,可以使用 `-t` 参数实现持续的 `ping` 检测。该参数会持续发送 ICMP 请求包,直到用户手动中断(通常通过 `Ctrl+C` 终止)。 命令格式: ``` ping -t IP地址或主机域名 ``` 示例: ```bash ping -t baidu.com ``` 此命令会持续向 `baidu.com` 发送 ICMP 请求包,直到用户按下 `Ctrl+C` 中断操作 [^1]。 #### Linux 系统中的持续 Ping 检测 在 Linux 系统中,可以使用 `-c` 参数指定发送 ICMP 请求包的次数,或者使用 `-i` 参数指定发送请求的时间间隔以实现持续检测。然而,若希望实现类似 Windows 系统中无限制的持续 `ping` 操作,可以直接省略 `-c` 参数。 命令格式: ``` ping IP地址或主机域名 ``` 示例: ```bash ping baidu.com ``` 此命令会持续向 `baidu.com` 发送 ICMP 请求包,直到用户按下 `Ctrl+C` 中断操作 [^1]。 #### 指定发送频率的持续 Ping 检测 在 Linux 系统中,还可以使用 `-i` 参数控制 `ping` 请求的时间间隔。例如,以下命令会每隔 2 秒发送一次 ICMP 请求包: ```bash ping -i 2 baidu.com ``` 此命令会持续向目标地址发送请求,间隔时间为 2 秒,直到用户按下 `Ctrl+C` 中断操作 。 #### 指定持续时间的 Ping 检测 如果希望指定持续时间的 `ping` 检测(例如,持续 60 秒),可以结合 `timeout` 命令实现。以下是一个示例: ```bash timeout 60 ping baidu.com ``` 此命令会在 60 秒内持续向目标地址发送 ICMP 请求包,并在时间到达后自动终止 。 #### 使用脚本实现持续 Ping 检测 在某些场景下,可能需要将 `ping` 检测结果记录到日志文件中,或者定期分析网络连通性。可以使用 Shell 脚本实现这一目标。 示例脚本: ```bash #!/bin/bash while true; do ping -c 1 baidu.com >> ping_log.txt echo "Ping completed at $(date)" >> ping_log.txt sleep 5 done ``` 此脚本会每隔 5 秒执行一次 `ping` 检测,并将结果记录到 `ping_log.txt` 文件中,直到用户手动中断脚本运行。 #### 使用 Golang 实现持续 Ping 检测 参考提供的代码示例,可以通过 Golang 的 `exec` 模块实现持续的 `ping` 检测。以下是一个修改后的示例代码,用于实现持续的 `ping` 操作: ```go package main import ( "fmt" "os/exec" "runtime" "time" ) func pingcmd(host string) bool { cmds := exec.Command("ping", host) err := cmds.Run() if err != nil { fmt.Println("Connection failed: ", host) return false } else { fmt.Println("Connection successful: ", host) return true } } func PingStatus(host string) bool { fmt.Println("Pinging ", host) sysType := runtime.GOOS fmt.Println("Current system type: ", sysType) if sysType == "windows" { for { status := pingcmd(host) if !status { fmt.Println("Error detected") } time.Sleep(5 * time.Second) } } else { host += " -c 5" for { status := pingcmd(host) if !status { fmt.Println("Error detected") } time.Sleep(5 * time.Second) } } } func main() { PingStatus("baidu.com") } ``` 此代码会每隔 5 秒执行一次 `ping` 检测,并持续运行,直到手动终止程序 [^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值