github.com/giovannyortegon/go@v0.0.0-20220115155912-8890063f5bdd/src/BlackHatGo/Chap02/tcp-sync-scanner/tcp-scanner-final.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"sort"
     7  )
     8  
     9  func worker(ports chan int, results chan int) {
    10  	for p := range ports {
    11  		address := fmt.Sprintf("scanme.nmap.org:%d", p)
    12  		conn, err := net.Dial("tcp", address)
    13  		if err != nil {
    14  			results <- 0
    15  			continue
    16  		}
    17  		conn.Close()
    18  		results <- p
    19  	}
    20  }
    21  
    22  func main() {
    23  	ports := make(chan int, 100)
    24  	results := make(chan int)
    25  	var openports [] int
    26  
    27  	for i := 0; i < cap(ports); i++ {
    28  		go worker(ports, results)
    29  	}
    30  
    31  	go func() {
    32  		for i := 1; i <= 1024; i++ {
    33  			ports <- i
    34  		}
    35  	}()
    36  
    37  	for i := 0; i <= 1024; i++ {
    38  		port := <- results
    39  		if port != 0 {
    40  			openports = append(openports, port)
    41  		}
    42  	}
    43  
    44  	close(ports)
    45  	close(results)
    46  	sort.Ints(openports)
    47  
    48  	for _, port := range openports {
    49  		fmt.Printf("%d open\n", port)
    50  	}
    51  }