我写了一个 golang 脚本来扫描开放端口并使用 sync.WaitGourp 来控制 goroutine 的数量。
当 goroutine 太大时,比如 2000,结果与 1000 不同。
类似于提前退出。代码显示如下
func worker(wg *sync.WaitGroup) {
for job := range jobs {
_, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", job.host, job.port), time.Millisecond*1500)
if err != nil {
results <- Result{job, false}
} else {
results <- Result{job, true}
}
}
wg.Done()
}
func main() {
go func() {
for i := 1; i < 65535; i++ {
jobs <- Job{host, i}
}
close(jobs)
}()
go func() {
for result := range results {
if result.status {
fmt.Println(result.job, "open")
}
}
}()
wg := sync.WaitGroup{}
for i := 1; i < 1000; i++ {
wg.Add(1)
go worker(&wg)
}
wg.Wait()
}
当 1000
{127.0.0.1 80} 打开 {127.0.0.1 631} 打开 {127.0.0.1 3306} 打开 {127.0.0.1 6379} 打开 {127.0.0.1 33060} 打开
当 2000 年
{127.0.0.1 80} 打开 {127.0.0.1 631} 打开
我希望 2000 输出所有端口,如 1000
泛舟湖上清波郎朗
慕的地6264312
相关分类