一、基础版本,稳定行差,后续需要深入分析
package main
import (
"fmt"
"net"
"sync"
"time"
)
// 第一步先把扫描功能拆分为一个独立函数。这样会使我们的代码看起来清晰。
// 判断端口是否开启,开启返回true
func isOpen(host string, port int) bool {
time.Sleep(time.Millisecond * 1)
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", host, port))
if err == nil {
_ = conn.Close()
return true
}
return false
}
// 我们的代码已经执行的很快了,但是由于超时的原因,我们需要等待很久才能收到返回的错误信息。我们可以假设如果我们200毫秒内没有收到服务器的回应,就不再继续等待。
// 返回结果也存在问题
// 主函数,我们会引入一个新的方法 WaitGroup ,在主函数中,我们可以拆分为协程去执行,然后等待执行结束。
func main() {
ports := []int{}
wg := &sync.WaitGroup{}
for port := 1; port < 65535; port++ {
wg.Add(1)
go func() {
opened := isOpen("127.0.0.1", port)
if opened {
ports = append(ports, port)
}
wg.Done()
}()
}
wg.Wait()
fmt.Printf("opened ports: %v\n", ports)
}
二、增强版本,可以用,稳定性比较强=-====可以使用
package main
import (
"fmt"
"net"
"sync"
"time"
)
// 第一步先把扫描功能拆分为一个独立