非并发扫描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) }
浙公网安备 33010602011771号