非并发扫描100个TCP地址的实现
func main() {
start:=time.Now()
//扫描端口
for i := 21; i < 120; i++ {
address := fmt.Sprintf("20.194.168.28:%d", i)
//扫描端口
conn, err := net.Dial("tcp", address)
if err != nil {
fmt.Printf("%s关闭了\n", address)
continue
}
conn.Close()
fmt.Printf("%s打开了\n", address)
}
elapsed:=time.Since(start)/1e9
fmt.Printf("\n %dseconds\n",elapsed)
}

 如下图是扫描结果及所用时间,可以看到100个地址大概用了30几分钟,速度是非常的慢

 

 

并发扫描100个TCP地址(使用计数器来控制协程)

//并发操作
func main() {
    start := time.Now()
    //定义一个计数器
    var wg sync.WaitGroup
    //扫描端口
    for i := 21; i < 120; i++ {
        wg.Add(1)
        go func(j int) {
            defer wg.Done()
            address := fmt.Sprintf("20.194.168.28:%d", j)
            //扫描端口
            conn, err := net.Dial("tcp", address)
            if err != nil {
                fmt.Printf("%s关闭了\n", address)
                return
            }
            conn.Close()
            fmt.Printf("%s打开了\n", address)
        }(i)
    }
    wg.Wait()
    elapsed := time.Since(start) / 1e9
    fmt.Printf("/n/n %d seconds\n", elapsed)
}

如下图是扫描结果和运行时间,时间为21秒,大概是非并发扫描速度的100倍

 

Worker池扫描1024个TCP地址(使用channel控制协程)

创建Worker池

func Worker(ports chan int, results chan int) {
for p := range ports {
address := fmt.Sprintf("20.194.168.28:%d", p)
conn, err := net.Dial("tcp", address)
if err != nil {
results <- 0
continue
}
//关闭连接
conn.Close()
results <- p
}
}

 

func main() {
    start := time.Now()
    ports := make(chan int, 100)
    results := make(chan int)
    var openports []int
    var closeports []int

    for i := 0; i < cap(ports); i++ {
        go Worker(ports, results)
    }
    //保证先流出后流入
    go func() {
        for j := 1; j < 1024; j++ {
            ports <- j
        }
    }()

    for i := 1; i < 1024; i++ {
        ports := <-results
        if ports != 0 {
            openports = append(openports, ports)
        } else {
            closeports = append(closeports, ports)
        }
    }
    //关闭channel通道
    close(ports)
    close(results)
    //对结果进行排序
    sort.Ints(openports)
    sort.Ints(closeports)
    for _, port := range openports {
        fmt.Printf("%d opened\n", port)
    }
    for _, port := range closeports {
        fmt.Printf("%d close\n", port)
    }
    elapsed := time.Since(start)
    fmt.Println("运行时间:", elapsed)
}

 

posted on 2020-10-10 11:40  红叶次  阅读(430)  评论(0)    收藏  举报