• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    go实现fping功能

    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功能
    上一篇:Ubuntu18.04 LTS搭建GO语言开发环境过程解析
    下一篇:GoLand编译带有构建标签的程序思路详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    go实现fping功能 实现,fping,功能,实现,fping,