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