非并发扫描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
}
}