咔叽网单游戏基地

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 46|回复: 0

[Golang] go实现fping功能

[复制链接]
  • TA的每日心情
    无聊
    2019-6-2 14:11
  • 签到天数: 4 天

    [LV.2]圆转纯熟

    2万

    主题

    2万

    帖子

    12万

    积分

    帖子管理员

    Rank: 9Rank: 9Rank: 9

    积分
    124347
    发表于 2020-12-19 15:20:26 | 显示全部楼层 |阅读模式
    1、什么是fping
    fping 是一个类似 ping 的程序,与 ping 不同的是你可以同时指定多个要 ping 的目标。
    fping 发送完 ping 包后不等待回应,而是继续下一个目标
    3、具体实现
    1.获取IP段
    1. // IP段
    2. '1', '2020-11-26 17:11:39.515', '2020-11-26 17:11:39.515', '1.0.1.0', '1.0.3.255', '福建', '电信'
    3. '2', '2020-11-26 17:11:43.553', '2020-11-26 17:11:43.553', '1.0.8.0', '1.0.15.255', '广东', '电信'
    4. '3', '2020-11-26 17:11:47.563', '2020-11-26 17:11:47.563', '1.0.32.0', '1.0.63.255', '广东', '电信'
    5. '4', '2020-11-26 17:11:53.621', '2020-11-26 17:11:53.621', '1.1.0.0', '1.1.0.255', '福建', '电信'
    6. '5', '2020-11-26 17:11:57.635', '2020-11-26 17:11:57.635', '1.1.2.0', '1.1.7.255', '福建', '电信'
    7. '6', '2020-11-26 17:11:59.642', '2020-11-26 17:11:59.642', '1.1.8.0', '1.1.63.255', '广东', '电信'
    8. '7', '2020-11-26 17:12:05.671', '2020-11-26 17:12:05.671', '1.2.0.0', '1.2.1.255', '福建', '电信'
    9. '8', '2020-11-26 17:12:07.674', '2020-11-26 17:12:07.674', '1.2.2.0', '1.2.2.255', '北京', '联通'
    10. '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方法(单个,多个已给出)
    1. // 单个ping
    2. // IsAlivePing : 检测目标IP是否能够ping通,target为目标IP
    3. func IsAlivePing(target string) (bool, error) {
    4. pinger, err := ping.NewPinger(target)
    5. if err != nil {
    6. return false, err
    7. }
    8. pinger.Count = 10
    9. PINGTIME := time.Duration(1000)
    10. pinger.Timeout = time.Duration(PINGTIME * time.Millisecond)
    11. pinger.SetPrivileged(true) // 选择icmp,不选择udp
    12. pinger.Run()
    13. stats := pinger.Statistics()
    14. // 判断是否有接收到的包
    15. if stats.PacketsRecv >= 1 {
    16. return true, nil
    17. }
    18. return false, nil
    19. }
    20. // 多个ping:得到死IP
    21. // FilterActiveIPs : 过滤活IP,筛选出死IP
    22. func FilterActiveIPs(ips []string) (inactiveIPs []string) {
    23. var lock sync.Mutex
    24. var wg sync.WaitGroup
    25. wg.Add(len(ips))
    26. for _, ip := range ips {
    27. go func(ip string) {
    28. defer wg.Done()
    29. // 判断是死ip,并且格式正确
    30. isAlive, err := IsAlivePing(ip)
    31. if !isAlive && err == nil {
    32. RandomSleep(2) // 睡眠[1,2]秒,二次确认是否为死IP
    33. if isAlive, _ := IsAlivePing(ip); !isAlive {
    34.   RandomSleep(2) // 再睡眠[1,2]秒,三次确认是否为死IP
    35.   if isAlive, _ := IsAlivePing(ip); !isAlive {
    36.   lock.Lock()
    37.   defer lock.Unlock()
    38.   inactiveIPs = append(inactiveIPs, ip)
    39.   }
    40. }
    41. }
    42. }(ip)
    43. }
    44. wg.Wait()
    45. return inactiveIPs
    46. }
    47. // 多个ping:得到活IP
    48. // FilterInactiveIPs : 过滤死IP,筛选出活IP
    49. func FilterInactiveIPs(ips []string) (activeIPs []string) {
    50. var lock sync.Mutex
    51. var wg sync.WaitGroup
    52. wg.Add(len(ips))
    53. for _, ip := range ips {
    54. go func(ip string) {
    55. defer wg.Done()
    56. // 判断是活ip,并且格式正确
    57. if isAlive, err := IsAlivePing(ip); isAlive && err == nil {
    58. lock.Lock()
    59. defer lock.Unlock()
    60. activeIPs = append(activeIPs, ip)
    61. }
    62. }(ip)
    63. }
    64. wg.Wait()
    65. return activeIPs
    66. }
    67. // RandomSleep : 随机睡眠[1,t]秒
    68. func RandomSleep(t int) {
    69. rand.Seed(time.Now().UnixNano())
    70. r := time.Duration(rand.Intn(t) + 1)
    71. time.Sleep(r * time.Second)
    72. }
    复制代码
    3.分解IP段
    1. // Separation : 分解IP段
    2. func (i *impl) Separation(minIP, maxIP string) []string {
    3.         shouldStrs := make([]string, 0) // 这是IP段的所有IP
    4.         // for i := 0; i < l; i = i + 2 {
    5.         min, _ := IPString2Long(minIP) // 这里有一个转化,我默认给的是正确的IP,如果兄弟们不确定传入的IP格式是否正确,那么要判断err
    6.         max, _ := IPString2Long(maxIP)
    7.         for min <= max {
    8.                 minIPstr, _ := Long2IPString(min)
    9.                 xxxip := net.ParseIP(minIPstr).To4()
    10.                 if xxxip[3] != 0 && xxxip[3] != 255 { // 兄弟们,这个判断取决于你们想不想要两个端点
    11.                         shouldStrs = append(shouldStrs, minIPstr)
    12.                 }
    13.                 min++
    14.         }
    15. // TODO: 兄弟们,可以把这句删除了
    16.         fmt.Printf("IP段%s--%s不包括两端的长度: %d\n", minIP, maxIP, len(shouldStrs))
    17.         return shouldStrs
    18. }
    19. // Long2IPString 把数值转为ip字符串
    20. func Long2IPString(i uint) (string, error) {
    21.         if i > math.MaxUint32 {
    22.                 return "", errors.New("beyond the scope of ipv4")
    23.         }
    24.         ip := make(net.IP, net.IPv4len)
    25.         ip[0] = byte(i >> 24)
    26.         ip[1] = byte(i >> 16)
    27.         ip[2] = byte(i >> 8)
    28.         ip[3] = byte(i)
    29.         return ip.String(), nil
    30. }
    31. // IPString2Long 把ip字符串转为数值
    32. func IPString2Long(ip string) (uint, error) {
    33.         b := net.ParseIP(ip).To4()
    34.         if b == nil {
    35.                 return 0, errors.New("invalid ipv4 format")
    36.         }
    37.         return uint(b[3]) | uint(b[2])<<8 | uint(b[1])<<16 | uint(b[0])<<24, nil
    38. }
    复制代码
    到此这篇关于go实现fping功能的文章就介绍到这了,更多相关go实现fping内容请搜索咔叽论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持咔叽论坛!

    原文地址:https://www.jb51.net/article/200939.htm
    回复

    使用道具 举报

    QQ|免责声明|手机版|咔叽网单

    GMT+8, 2021-3-3 03:46

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表