美文网首页
golang 高效端口扫描

golang 高效端口扫描

作者: 郭青耀 | 来源:发表于2020-12-02 00:03 被阅读0次

    废话少说,直接上源码,需要注意几点在源码后有说明。

    package main
    
    import (
        "fmt"
        "net"
        "os"
        "sync"
        "time"
    )
    
    var wg = sync.WaitGroup{}
    
    func main() {
        svcs := []string{"127.0.0.1:8088", "127.0.0.1:8340", "127.0.0.1:8350", "127.0.0.1:8351", "127.0.0.1:8353", "127.0.0.1:8355", "127.0.0.1:8354"}
    
        //loopMax := len(svcs)
        limitGrouting := 1000
        ch := make(chan struct{}, limitGrouting)
        defer close(ch)
    
        for _, svc := range svcs {
            go DailUnit(ch, svc)
        }
        wg.Wait()
    }
    
    func DailUnit(ch chan struct{}, svc string) {
        defer wg.Done()
        wg.Add(1)
        ch <- struct{}{}
        conn, err := net.DialTimeout("tcp", svc, time.Second)
        if err != nil {
            fmt.Fprintf(os.Stderr, "server %s dail error: %s\n", svc, err.Error())
            <-ch
            return
        }
        fmt.Println(svc + "dail ok")
        conn.Close()
        <-ch
    }
    
    
    • 这里使用的带缓冲的channal,控制协程的数量limitGrouting。
    • sync.WaitGroup为了是所有输出都能打印出来。
    • DialTimeout的具体时间,可以根据自己的网络情况设置。
    • 注意在DailUnit,错误返回前,也要将读取通道,否则带缓冲的通道就会被端口不通的异常场景写满,导致程序阻塞。
    • 端口开放场景,最好关闭连接

    相关文章

      网友评论

          本文标题:golang 高效端口扫描

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