美文网首页
Go 实现 TCP 端口扫描器

Go 实现 TCP 端口扫描器

作者: 三梦哥 | 来源:发表于2020-07-05 21:23 被阅读0次

    因为 Go 原生支持高并发,所以可以用高效的协程goroutine 来实现一个TCP 端口扫描器。

    这里通过互斥锁来解决数据竞争问题,使用WaitGroup来解决协程同步的问题,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笔记本上面测试80~500有哪些端口是开放的,程序输出ports有:

    TCPScanner 输出结果
    Windows上面的netstat -ano命令行指令结果如下:
    Windows 命令行结果
    可以发现,通过的TCPScanner得出的结果是正确的。

    相关文章

      网友评论

          本文标题:Go 实现 TCP 端口扫描器

          本文链接:https://www.haomeiwen.com/subject/eudbqktx.html