因?yàn)?Go 原生支持高并發(fā),所以可以用高效的協(xié)程
goroutine來(lái)實(shí)現(xiàn)一個(gè)TCP 端口掃描器。
這里通過(guò)互斥鎖來(lái)解決數(shù)據(jù)競(jìng)爭(zhēng)問(wèn)題,使用WaitGroup來(lái)解決協(xié)程同步的問(wèn)題,TCPScanner代碼如下:
package main
import (
"fmt"
"log"
"net"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
var mutex sync.Mutex
ports := make([]int, 0)
for i := 80; i <= 50000; i++ {
wg.Add(1)
go func(port int) {
defer wg.Done()
conn, err := net.DialTimeout("tcp", fmt.Sprintf("127.0.0.1:%d", port), time.Second)
if err != nil {
log.Printf("Error:%v.Port:[%d]\n", err, port)
} else {
conn.Close()
log.Printf("Connection successful.Port:[%d]\n", port)
mutex.Lock()
ports = append(ports, port)
mutex.Unlock()
}
}(i)
}
wg.Wait()
fmt.Printf("Opened ports:%v", ports)
}
在筆者的Windows 10筆記本上面測(cè)試80~500有哪些端口是開(kāi)放的,程序輸出ports有:

TCPScanner 輸出結(jié)果
Windows上面的netstat -ano命令行指令結(jié)果如下:
Windows 命令行結(jié)果
可以發(fā)現(xiàn),通過(guò)的
TCPScanner得出的結(jié)果是正確的。