-
Notifications
You must be signed in to change notification settings - Fork 2
/
ports.go
103 lines (74 loc) · 1.92 KB
/
ports.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package scanner
import (
"fmt"
"net"
"time"
)
const (
REQUEST_TIMEOUT = time.Duration(time.Millisecond * 400)
REQUEST_CONCURRENCY = 200
PORT_STARTS = 1
PORT_ENDS = 65535
)
func AllOpenedPorts(address string) (scanReport ScanReport, error error) {
ports := []int{}
for i := PORT_STARTS; i <= PORT_ENDS; i++ {
ports = append(ports, i)
}
scanReport, error = CheckSpecificPorts(address, ports)
return
}
func CheckSpecificPorts(address string, ports []int) (scanReport ScanReport, error error) {
entryPointCollection, error := ListAllHostsAndPorts(address, ports)
if error != nil {
return
}
concurrency := make(chan uint, REQUEST_CONCURRENCY)
defer close(concurrency)
channel := make(chan EntryPoint)
defer close(channel)
for _, entryPoint := range entryPointCollection {
concurrency <- 1
go func(entryPoint EntryPoint) {
entryPoint.Opened = IsPortOpened(entryPoint.Host, entryPoint.Port)
<-concurrency
channel <- entryPoint
}(entryPoint)
}
processedEntries := []EntryPoint{}
for entryPoint := range channel {
processedEntries = append(processedEntries, entryPoint)
if len(entryPointCollection) == len(processedEntries) {
break
}
}
scanReport = ScanReport{}
scanReport.Compose(processedEntries)
return
}
func ListAllHostsAndPorts(address string, ports []int) (list []EntryPoint, error error) {
hosts, error := ResolveAddress(address)
if error != nil {
return
}
for _, host := range hosts {
for _, port := range ports {
entryPoint := EntryPoint{Host: host, Port: port}
list = append(list, entryPoint)
}
}
return
}
func IsPortOpened(host string, port int) bool {
address := fmt.Sprintf("%s:%d", host, port)
tcpAddr, error := net.ResolveTCPAddr("tcp4", address)
if error != nil {
return false
}
connection, error := net.DialTimeout("tcp", tcpAddr.String(), REQUEST_TIMEOUT)
if error != nil {
return false
}
connection.Close()
return true
}