前端之家收集整理的这篇文章主要介绍了
Golang 端口扫描 demo,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
本文是根据源代码改编的,原代码路径
@H_
301_2@
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
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())
}
@H_
301_2@输入命令(192.168.0.110 是我的局域网 ip 地址, 开始端口和结束端口写的接近以便示例):
go run port_scanner.go 192.168.0.110 0000 0139
@H_
301_2@
输出:
扫描开始: 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