go实现fping功能

 更新时间:2020-12-09 21:04:53   作者:佚名   我要评论(0)

1、什么是fping
fping 是一个类似 ping 的程序,与 ping 不同的是你可以同时指定多个要 ping 的目标。

fping 发送完 ping 包后不等待回应,而是继续下一个目标
3、

1、什么是fping

fping 是一个类似 ping 的程序,与 ping 不同的是你可以同时指定多个要 ping 的目标。
fping 发送完 ping 包后不等待回应,而是继续下一个目标

3、具体实现

1.获取IP段

// IP段
'1', '2020-11-26 17:11:39.515', '2020-11-26 17:11:39.515', '1.0.1.0', '1.0.3.255', '福建', '电信'
'2', '2020-11-26 17:11:43.553', '2020-11-26 17:11:43.553', '1.0.8.0', '1.0.15.255', '广东', '电信'
'3', '2020-11-26 17:11:47.563', '2020-11-26 17:11:47.563', '1.0.32.0', '1.0.63.255', '广东', '电信'
'4', '2020-11-26 17:11:53.621', '2020-11-26 17:11:53.621', '1.1.0.0', '1.1.0.255', '福建', '电信'
'5', '2020-11-26 17:11:57.635', '2020-11-26 17:11:57.635', '1.1.2.0', '1.1.7.255', '福建', '电信'
'6', '2020-11-26 17:11:59.642', '2020-11-26 17:11:59.642', '1.1.8.0', '1.1.63.255', '广东', '电信'
'7', '2020-11-26 17:12:05.671', '2020-11-26 17:12:05.671', '1.2.0.0', '1.2.1.255', '福建', '电信'
'8', '2020-11-26 17:12:07.674', '2020-11-26 17:12:07.674', '1.2.2.0', '1.2.2.255', '北京', '联通'
'9', '2020-11-26 17:12:13.690', '2020-11-26 17:12:13.690', '1.2.5.0', '1.2.7.255', '北京', '电信'

2.ping方法(单个,多个已给出)

// 单个ping
// IsAlivePing : 检测目标IP是否能够ping通,target为目标IP
func IsAlivePing(target string) (bool, error) {
 pinger, err := ping.NewPinger(target)
 if err != nil {
 return false, err
 }
 pinger.Count = 10
 PINGTIME := time.Duration(1000)
 pinger.Timeout = time.Duration(PINGTIME * time.Millisecond)
 pinger.SetPrivileged(true) // 选择icmp,不选择udp
 pinger.Run()
 stats := pinger.Statistics()
 // 判断是否有接收到的包
 if stats.PacketsRecv >= 1 {
 return true, nil
 }
 return false, nil
}

// 多个ping:得到死IP
// FilterActiveIPs : 过滤活IP,筛选出死IP
func FilterActiveIPs(ips []string) (inactiveIPs []string) {
 var lock sync.Mutex
 var wg sync.WaitGroup
 wg.Add(len(ips))
 for _, ip := range ips {
 go func(ip string) {
 defer wg.Done()
 // 判断是死ip,并且格式正确
 isAlive, err := IsAlivePing(ip)
 if !isAlive && err == nil {
 RandomSleep(2) // 睡眠[1,2]秒,二次确认是否为死IP
 if isAlive, _ := IsAlivePing(ip); !isAlive {
  RandomSleep(2) // 再睡眠[1,2]秒,三次确认是否为死IP
  if isAlive, _ := IsAlivePing(ip); !isAlive {
  lock.Lock()
  defer lock.Unlock()
  inactiveIPs = append(inactiveIPs, ip)
  }
 }
 }
 }(ip)
 }
 wg.Wait()
 return inactiveIPs
}

// 多个ping:得到活IP
// FilterInactiveIPs : 过滤死IP,筛选出活IP
func FilterInactiveIPs(ips []string) (activeIPs []string) {
 var lock sync.Mutex
 var wg sync.WaitGroup
 wg.Add(len(ips))
 for _, ip := range ips {
 go func(ip string) {
 defer wg.Done()
 // 判断是活ip,并且格式正确
 if isAlive, err := IsAlivePing(ip); isAlive && err == nil {
 lock.Lock()
 defer lock.Unlock()
 activeIPs = append(activeIPs, ip)
 }
 }(ip)
 }
 wg.Wait()
 return activeIPs
}

// RandomSleep : 随机睡眠[1,t]秒
func RandomSleep(t int) {
 rand.Seed(time.Now().UnixNano())
 r := time.Duration(rand.Intn(t) + 1)
 time.Sleep(r * time.Second)
}

3.分解IP段

// Separation : 分解IP段
func (i *impl) Separation(minIP, maxIP string) []string {
	shouldStrs := make([]string, 0) // 这是IP段的所有IP
	// for i := 0; i < l; i = i + 2 {
	min, _ := IPString2Long(minIP) // 这里有一个转化,我默认给的是正确的IP,如果兄弟们不确定传入的IP格式是否正确,那么要判断err
	max, _ := IPString2Long(maxIP)
	for min <= max {
		minIPstr, _ := Long2IPString(min)
		xxxip := net.ParseIP(minIPstr).To4()
		if xxxip[3] != 0 && xxxip[3] != 255 { // 兄弟们,这个判断取决于你们想不想要两个端点
			shouldStrs = append(shouldStrs, minIPstr)
		}
		min++
	}

 // TODO: 兄弟们,可以把这句删除了
	fmt.Printf("IP段%s--%s不包括两端的长度: %d\n", minIP, maxIP, len(shouldStrs))
	return shouldStrs
}

// Long2IPString 把数值转为ip字符串
func Long2IPString(i uint) (string, error) {
	if i > math.MaxUint32 {
		return "", errors.New("beyond the scope of ipv4")
	}

	ip := make(net.IP, net.IPv4len)
	ip[0] = byte(i >> 24)
	ip[1] = byte(i >> 16)
	ip[2] = byte(i >> 8)
	ip[3] = byte(i)

	return ip.String(), nil
}

// IPString2Long 把ip字符串转为数值
func IPString2Long(ip string) (uint, error) {
	b := net.ParseIP(ip).To4()
	if b == nil {
		return 0, errors.New("invalid ipv4 format")
	}

	return uint(b[3]) | uint(b[2])<<8 | uint(b[1])<<16 | uint(b[0])<<24, nil
}

到此这篇关于go实现fping功能的文章就介绍到这了,更多相关go实现fping内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • golang并发ping主机的方法
  • 利用Python脚本实现ping百度和google的方法
  • 利用Go语言实现简单Ping过程的方法
  • python使用xmlrpclib模块实现对百度google的ping功能

相关文章

  • go实现fping功能

    go实现fping功能

    1、什么是fping fping 是一个类似 ping 的程序,与 ping 不同的是你可以同时指定多个要 ping 的目标。 fping 发送完 ping 包后不等待回应,而是继续下一个目标 3、
    2020-12-09
  • goland2020.2.x永久激活码破解详细教程亲测可用(Windows Linux Mac)

    goland2020.2.x永久激活码破解详细教程亲测可用(Windows Linux Mac)

    上篇文章给大家分享了goland2019.1版本的激活码和激活教程,感兴趣的朋友点击此处了解详情! goland已经更新到2020.2.3,很多小伙伴都在用2019版,该升级了! 本文
    2020-12-09
  • 使用go实现删除sql里面的注释和字符串功能(demo)

    使用go实现删除sql里面的注释和字符串功能(demo)

    项目里面有一个需求,要对sql进行简单的语法分析 为了避免sql里面的字符串和注释对语法分析做干扰,我写了一个java函数,对sql进行修剪,删除里面字符串和注释,用空
    2020-12-09
  • GoLand编译带有构建标签的程序思路详解

    GoLand编译带有构建标签的程序思路详解

    简单构建一个项目,如下是mian.go文件 package main // 条件编译-构建标签-如何使用IDE编译和识别 func main() { RequestByRpc() } 模拟带有一个http tags的文
    2020-12-09
  • 聊聊golang的defer的使用

    聊聊golang的defer的使用

    序 本文主要研究一下golang的defer defer return先赋值(对于命名返回值),然后执行defer,最后函数返回 defer函数调用的执行顺序与它们分别所属的defer语
    2020-12-09
  • 部署Go语言项目的 N 种方法(小结)

    部署Go语言项目的 N 种方法(小结)

    本文以部署 Go Web 程序为例,介绍了在 CentOS7 服务器上部署 Go 语言程序的若干方法。 部署Go语言项目 本文以部署 Go Web 程序为例,介绍了在 CentOS7 服务器上部署
    2020-12-09
  • 基于gin的golang web开发之认证利器jwt

    基于gin的golang web开发之认证利器jwt

    JSON Web Token(JWT)是一种很流行的跨域认证解决方案,JWT基于JSON可以在进行验证的同时附带身份信息,对于前后端分离项目很有帮助。 eyJhbGciOiJIUzI1NiIsInR5c
    2020-12-09
  • go语言入门环境搭建及GoLand安装教程详解

    go语言入门环境搭建及GoLand安装教程详解

    Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC
    2020-12-09
  • mac下安装golang框架iris的方法

    mac下安装golang框架iris的方法

    安装前准备: 设置GOPROXY代理 参考:https://goproxy.cn/ 我使用的是下面的两条命令: $ go env -w GO111MODULE=on $ go env -w GOPROXY=https://goproxy.cn,dir
    2020-12-09
  • goland 设置注释模板的过程图文详解

    goland 设置注释模板的过程图文详解

    网上找了一些办法 都没有说到关键点: 梳理一下设置步骤如下,以及避免的坑。 新建文件自动加注释: Preferences | Editor | File and Code Templates 打开go File
    2020-12-09

最新评论