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

(编辑:jimmy 日期: 2024/12/22 浏览:2)

本文实例讲述了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语言程序设计有所帮助。

一句话新闻

Windows上运行安卓你用过了吗
在去年的5月23日,借助Intel Bridge Technology以及Intel Celadon两项技术的驱动,Intel为PC用户带来了Android On Windows(AOW)平台,并携手国内软件公司腾讯共同推出了腾讯应用宝电脑版,将Windows与安卓两大生态进行了融合,PC的使用体验随即被带入到了一个全新的阶段。