golang 根据网段拆分成ip 多线程进行端口探测做好异常判断
在Go语言中,可以使用net.IPNet来表示一个IP网段。然后,可以使用net.ParseCIDR函数来解析IP网段的字符串表示形式。
下面是一个使用多线程进行端口探测的示例代码,其中包含了异常判断:
package main
import (
"fmt"
"net"
"sync"
"time"
)
func main() {
// 定义要探测的IP网段
ipRange := "192.168.0.0/24"
targetPorts := []int{80, 443} // 要探测的端口列表
// 解析IP网段
_, ipNet, err := net.ParseCIDR(ipRange)
if err != nil {
fmt.Println("解析IP网段失败:", err)
return
}
// 创建等待组,用于等待所有线程完成
var wg sync.WaitGroup
// 遍历IP网段中的所有IP地址
for ip := ipNet.IP.Mask(ipNet.Mask); ipNet.Contains(ip); inc(ip) {
wg.Add(1)
// 复制当前IP地址到goroutine中
ip := ip
// 启动一个新的goroutine进行端口探测
go func() {
defer wg.Done()
// 遍历端口列表,进行端口探测
for _, port := range targetPorts {
address := fmt.Sprintf("%s:%d", ip.String(), port)
conn, err := net.DialTimeout("tcp", address, 10*time.Second)
if err != nil {
fmt.Printf("无法连接到 %s: %v\n", address, err)
continue
}
conn.Close()
fmt.Printf("成功连接到 %s\n", address)
}
}()
}
// 等待所有线程完成
wg.Wait()
}
// 递增IP地址
func inc(ip net.IP) {
for j := len(ip) - 1; j >= 0; j-- {
ip[j]++
if ip[j] > 0 {
break
}
}
}
在上述代码中,我们首先解析了输入的IP网段,然后遍历该网段中的所有IP地址。对于每个IP地址,我们启动一个新的goroutine来进行端口探测。在每个goroutine中,我们遍历要探测的端口列表,使用net.DialTimeout函数来尝试连接到目标IP地址和端口。如果连接成功,我们会打印出成功连接的信息。如果连接失败,我们会打印出失败的信息。
此外,我们还使用了一个等待组(sync.WaitGroup)来等待所有的goroutine完成。在每个goroutine结束时,我们调用wg.Done()来通知等待组该goroutine已完成。在主goroutine中,我们调用wg.Wait()来阻塞等待,直到所有的goroutine都完成。
希望以上代码对你有所帮助
原文地址: http://www.cveoy.top/t/topic/hZGL 著作权归作者所有。请勿转载和采集!