您的位置:首页 > 编程语言 > Go语言

Golang 端口扫描 demo

2016-07-29 08:50 309 查看

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

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", ip, startport, endport)

go loop(inport, startport, endport)

for v := range inport {
go scanner(v, outport, ip, 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: