法一
package mainimport ( "fmt" "net")func main() { var datas []int // 用来保留扫描到的port var ports chan int = make(chan int) var done chan int = make(chan int) // 创立消费者 for i := 0; i < 10; i++ { go func() { for { port, ok := <-ports if !ok { break } add := fmt.Sprintf("scanme.namp.com:%d", port) _, err := net.Dial("tcp", add) if err != nil { //log.Fatalln(err) fmt.Println(err) } else { datas = append(datas, port) } } done <- 1 }() } for i := 1; i < 100; i++ { ports <- i } for v := range done { fmt.Println(v) } fmt.Println(datas)}
法二
package mainimport ( "fmt" "net" "sort")func worker(ports, results chan int) { for p := range ports { address := fmt.Sprintf("192.168.1.19:%d", p) conn, err := net.Dial("tcp", address) if err != nil { results <- 0 continue } conn.Close() results <- p }}func main() { ports := make(chan int, 100) 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) }}