非并发扫描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 continue } //关闭连接 conn.Close() results }}
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)
}
Original: https://www.cnblogs.com/hongyeci/p/13790345.html
Author: 红叶次
Title: golang实现TCP扫描器
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609331/
转载文章受原作者版权保护。转载请注明原作者出处!