Golang 端口扫描 demo

前端之家收集整理的这篇文章主要介绍了Golang 端口扫描 demo前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文是根据源代码改编的,原代码路径

http://studygolang.com/articles/6176

优化后的代码 port_scanner.go

package main

import (
    "fmt"
    "net"
    "os"
    "runtime"
    "strconv"
    "sync"
    "time"
)

func loop(inport chan int,startport,endport int) {
    for i := startport; i <= endport; i++ {
        inport <- i
    }
    close(inport)
}

type ScanSafeCount struct {
    count int
    mux   sync.Mutex
}

var scanCount ScanSafeCount

func scanner(inport int,outport chan int,ip string,endport int) {
    in := inport
    fmt.Printf(" %d ",in)
    host := fmt.Sprintf("%s:%d",ip,in)
    tcpAddr,err := net.ResolveTCPAddr("tcp4",host)
    if err != nil {
        // fmt.Printf("不行 %s\n",host)
        outport <- 0
    } else {
        conn,err := net.DialTimeout("tcp",tcpAddr.String(),200*time.Millisecond)
        // conn,err := net.Dial("tcp",host)
        if err != nil {
            // fmt.Printf("不可以 %d\n",in)
            outport <- 0
        } else {
            outport <- in
            fmt.Printf("\n *************( %d 可以 )*****************\n",in)
            conn.Close()
        }

    }

    scanCount.mux.Lock()
    scanCount.count = scanCount.count - 1
    if scanCount.count <= 0 {
        close(outport)
    }
    scanCount.mux.Unlock()

}

func main() {
    runtime.GOMAXPROCS(runtime.Numcpu())
    inport := make(chan int)
    outport := make(chan int)
    collect := []int{}

    fmt.Println(os.Args,len(os.Args))
    if len(os.Args) != 4 {
        fmt.Println("使用方式: port_scanner IP startport endport")
        os.Exit(0)
    }

    fmt.Println("扫描开始:",time.Now().Unix())

    ip := string(os.Args[1])
    startport,_ := strconv.Atoi(os.Args[2])
    endport,_ := strconv.Atoi(os.Args[3])

    if startport > endport {
        fmt.Println("Usage: scanner IP startport endport")
        fmt.Println("Endport must be larger than startport")
        os.Exit(0)
    } else {
        scanCount = ScanSafeCount{count: (endport - startport + 1)}
    }

    fmt.Printf("扫描 %s:%d----------%d\n",endport)

    go loop(inport,endport)

    for v := range inport {
        go scanner(v,outport,endport)
    }

    for port := range outport {
        if port != 0 {
            collect = append(collect,port)
        }
    }

    fmt.Println("--")
    fmt.Println(collect)
    fmt.Println("扫描结束",time.Now().Unix())

}

输入命令(192.168.0.110 是我的局域网 ip 地址, 开始端口和结束端口写的接近以便示例):

go run port_scanner.go 192.168.0.110 0000 0139

输出

扫描开始: 1469689864
扫描 192.168.0.110:0----------139
 1  3  13  12  53  5  85  127  7  6  9  11  10  0  15  14  17  16  19  18  21  20  23  22  25  24  2
7  26  29  28  31  30  33  32  35  34  37  36  39  38  41  40  43  42  45  44  47  46  49  48  2  50
  51  52  55  54  57  56  59  58  61  60  63  62  65  64  67  66  69  68  71  70  73  72  75  74  77
  76  79  78  81  80  83  82  84  87  86  89  88  91  90  93  92  95  94  97  96  99  98  101  100
103  102  105  104  107  106  109  108  111  110  113  112  115  114  117  116  119  118  121  120
123  4  122  124  125  126  129  128  131  130  133  132  135  134
 *************( 135 可以 )*****************
 136  139
 *************( 139 可以 )*****************
 8  137  138 --
[135 139]
扫描结束 1469689864
原文链接:https://www.f2er.com/go/189491.html

猜你在找的Go相关文章