Go语言实现的简单网络端口扫描方法

端口扫描
这篇文章主要介绍了Go语言实现的简单网络端口扫描方法,实例分析了Go语言网络程序的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了Go语言实现的简单网络端口扫描方法。分享给大家供大家参考。具体实现方法如下:

package main
import (
 "net"
 "fmt"
 "os"
 "runtime"
 "time"
 "strconv"
)

func loop(startport, endport int, inport chan int) {   for i := startport; i <= endport; i++{    inport <- i   } }

func scanner(inport, outport, out chan int, ip net.IP, endport int){  for{   in := <- inport   //fmt.Println(in)   tcpaddr := &net.TCPAddr{ip,in}   conn, err := net.DialTCP("tcp", nil, tcpaddr)   if err != nil {    outport <- 0   }else{    outport <- in   }   conn.Close()   if in == endport{    out <- in   }  } }

func main() {  starttime := time.Now().Unix()  runtime.GOMAXPROCS(4)  inport := make(chan int)  outport := make(chan int)  out := make(chan int)  collect := []int{}  if len(os.Args) != 4 {   fmt.Println("Usage: scanner.exe IP startport endport")   fmt.Println("Endport must be larger than startport")   os.Exit(0)  }  ip := net.ParseIP(os.Args[1])  if(os.Args[3] < os.Args[2]) {   fmt.Println("Usage: scanner IP startport endport")   fmt.Println("Endport must be larger than startport")   os.Exit(0)  }  startport, _:= strconv.Atoi(os.Args[2])  endport, _ := strconv.Atoi(os.Args[3])  go loop(startport, endport, inport)  for{   select {    case <-out:     fmt.Println(collect)     endtime := time.Now().Unix()     fmt.Println("The scan process has spent ",endtime-starttime,"second")     os.Exit(0)    default:     go scanner(inport, outport, out, ip, endport)     port := <- outport          if port != 0{      collect = append(collect, port)     }   }    } }

希望本文所述对大家的Go语言程序设计有所帮助。