package main
import (
"bufio"
"fmt"
"github.com/sparrc/go-ping"
"log"
"os"
"time"
)
type PingRestult struct {
ip string
time time.Duration
}
func MultiPing(urls []string, ch chan PingRestult) {
for {
for _, url := range urls {
go PingIp(url, ch)
}
time.Sleep(1 * time.Second)
}
}
func GetResult(ch chan PingRestult) {
for {
fmt.Println(<-ch)
}
}
func PingIp(ip string, ch chan PingRestult) {
pinger, err := ping.NewPinger(ip)
pinger.SetPrivileged(true)
if err != nil {
panic(err)
}
pinger.Count = 1
pinger.Timeout = time.Second * 1
pinger.Run()
// blocks until finished
stats := pinger.Statistics()
result := PingRestult{ip, stats.AvgRtt}
ch <- result
}
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
var lines []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
ch := make(chan PingRestult, len(lines))
defer close(ch)
go GetResult(ch)
MultiPing(lines, ch)
select {}
}
在 file.txt 有 ip 列表,取出来,放在一个死循环中得到 ping 的结果。
但是 MultiPing 中好像会有内存泄露,应该是回收的地方做的不对。
问问大佬们这种咋处理。感谢。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.