58 lines
879 B
Go
58 lines
879 B
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"net"
|
|
"sort"
|
|
)
|
|
|
|
var hostname string
|
|
|
|
func init() {
|
|
flag.StringVar(&hostname, "host", "", "the host to be scanned (i.e. localhost)")
|
|
}
|
|
|
|
func worker(ports, results chan int) {
|
|
for p := range ports {
|
|
address := fmt.Sprintf("%s:%d", hostname, p)
|
|
conn, err := net.Dial("tcp", address)
|
|
if err != nil {
|
|
results <- 0
|
|
continue
|
|
}
|
|
conn.Close()
|
|
results <- p
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
ports := make(chan int, 1000)
|
|
results := make(chan int)
|
|
var openports []int
|
|
|
|
for i := 0; i < cap(ports); i++ {
|
|
go worker(ports, results)
|
|
}
|
|
|
|
go func() {
|
|
for i := 1; i <= 65535; i++ {
|
|
ports <- i
|
|
}
|
|
}()
|
|
|
|
for i := 0; i < 65535; i++ {
|
|
port := <-results
|
|
if port != 0 {
|
|
openports = append(openports, port)
|
|
}
|
|
}
|
|
|
|
close(ports)
|
|
close(results)
|
|
sort.Ints(openports)
|
|
for _, port := range openports {
|
|
fmt.Printf("%d open\n", port)
|
|
}
|
|
}
|