在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都完成。

希望以上代码对你有所帮助

golang 根据网段拆分成ip 多线程进行端口探测做好异常判断

原文地址: http://www.cveoy.top/t/topic/hZGL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录