文章摘要
这篇文章主要展示了如何使用Go语言通过并行处理实现端口扫描功能。代码中使用了`channels`(通道)和`goroutine`(并行函数)来同时尝试连接多个端口。对于每个端口,代码尝试通过TCP方式连接,如果连接成功则将端口标记为“已打开”,否则标记为“关闭”。完成扫描后,代码对所有成功连接的端口进行排序,并按顺序输出结果。文章的核心内容在于并行连接尝试、端口记录以及结果的排序与输出。
package main
import (
“fmt”
“net”
“sort”
)
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() {
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 i :=1; i < 1024; i++ {
ports <- i
}
}()
for i :=1; i < 1024; i++ {
port :=<-results
if port !=0 {
openports=append(openports, port)
} else {
closeports=append(closeports, port)
}
}
close(ports)
close(results)
sort.Ints(openports)
sort.Ints(closeports)
for _, port :=range closeports {
fmt.Printf(“%d closed\n”, port)
}
for _, port :=range openports {
fmt.Printf(“%d opened\n”, port)
}
}
// 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”, elapsed)
// }
// func main() {
// 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 failed 关闭了\n”, address)
// continue
// }
// conn.Close()
// fmt.Printf(“%s connected 打开了!!!\n”, address)
// }
// }
import (
“fmt”
“net”
“sort”
)
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() {
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 i :=1; i < 1024; i++ {
ports <- i
}
}()
for i :=1; i < 1024; i++ {
port :=<-results
if port !=0 {
openports=append(openports, port)
} else {
closeports=append(closeports, port)
}
}
close(ports)
close(results)
sort.Ints(openports)
sort.Ints(closeports)
for _, port :=range closeports {
fmt.Printf(“%d closed\n”, port)
}
for _, port :=range openports {
fmt.Printf(“%d opened\n”, port)
}
}
// 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”, elapsed)
// }
// func main() {
// 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 failed 关闭了\n”, address)
// continue
// }
// conn.Close()
// fmt.Printf(“%s connected 打开了!!!\n”, address)
// }
// }
© 版权声明
文章版权归作者所有,未经允许请勿转载。