package main
//线程池方式
import (
"fmt"
"github.com/loveleshsharma/gohive"
"net"
"sync"
"time"
)
//wg
var wg sync.WaitGroup
//地址管道,100容量
var addressChan = make(chan string, 100)
//工人
func worker() {
//函数结束释放连接
defer wg.Done()
for {
address, ok := <-addressChan
if !ok {
break
}
//fmt.Println("address:", address)
conn, err := net.Dial("tcp", address)
//conn, err := net.DialTimeout("tcp", address, 10)
if err != nil {
//fmt.Println("close:", address, err)
continue
}
conn.Close()
fmt.Println("open:", address)
}
}
func main() {
var begin = time.Now()
//ip
var ip = "192.168.99.112"
//线程池大小
var pool_size = 70000
var pool = gohive.NewFixedSizePool(pool_size)
//拼接ip:端口
//启动一个线程,用于生成ip:port,并且存放到地址管道种
go func() {
for port := 1; port <= 65535; port++ {
var address = fmt.Sprintf("%s:%d", ip, port)
//将address添加到地址管道
//fmt.Println("<-:",address)
addressChan <- address
}
//发送完关闭 addressChan 管道
close(addressChan)
}()
//启动pool_size工人,处理addressChan种的每个地址
for work := 0; work < pool_size; work++ {
wg.Add(1)
pool.Submit(worker)
}
//等待结束
wg.Wait()
//计算时间
var elapseTime = time.Now().Sub(begin)
fmt.Println("耗时:", elapseTime)
}