温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用go语言怎么编写一个fping功能

发布时间:2020-12-01 16:04:27 阅读:273 作者:Leah 栏目:开发技术
GO开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

今天就跟大家聊聊有关使用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) (boolerror) {
 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 truenil
 }
 return falsenil
}

// 多个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([]string0// 这是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) (stringerror) {
	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) (uinterror) {
	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])<<24nil
}

看完上述内容,你们对使用go语言怎么编写一个fping功能有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×