最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語言制作端口掃描器

 更新時(shí)間:2015年03月20日 14:43:21   投稿:hebedich  
本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。

GO語言編寫的TCP端口掃描器,本人的第一個(gè)GO程序。

Git@OSChttp://git.oschina.net/youshusoft/GoScanner

使用命令:

Scanner startIp [endIp] port thread

參數(shù)說明:

startIp  開始IP
endIp  結(jié)束IP,可選,不輸入表示只掃描startIp
port  掃描端口,單個(gè)端口:3389;多個(gè)端口:1433,3389;連續(xù)端口:135-3389
thread  最大并發(fā)線程數(shù),最高2048

掃描結(jié)果保存在同目錄下的 result.txt 中,每次啟動(dòng)都會(huì)清掉之前的內(nèi)容。

例子一:
Scanner 58.96.172.22 58.96.172.220 80 512
掃描58.96.172.22到58.96.172.220中的80端口,最大并發(fā)線程512。

例子二:
Scanner 58.96.172.22 58.96.172.220 21,5631 512
掃描58.96.172.22到58.96.172.220中的21和5631端口,最大并發(fā)線程512。

例子三:
Scanner 58.96.172.22 58.96.172.220 1-520 512
掃描58.96.172.22到58.96.172.220中的1到520端口,最大并發(fā)線程512。

例子四:
Scanner 58.96.172.22 1-520 512
掃描58.96.172.22中的1到520端口,最大并發(fā)線程512。

package main
import (
"fmt"
"strconv"
"flag"
"strings"
"net"
"os"
)
/**
  掃描地址
*/
var ipAddrs chan string = make(chan string)
//掃描結(jié)果
var result chan string = make(chan string)
//線程數(shù)
var thread chan int = make(chan int)
var nowThread int;
//關(guān)閉程序
var clo chan bool = make(chan bool)
//保存結(jié)果
func writeResult(){
  fileName := "result.txt"
  fout,err := os.Create(fileName)
  if err != nil{
    //文件創(chuàng)建失敗
    fmt.Println(fileName + " create error")
  }
  defer fout.Close()
  s,ok := <- result
  for ;ok;{
    fout.WriteString(s + "\r\n")
    s,ok = <- result
  }
  //通知進(jìn)程退出
  clo <- true; 
}
//根據(jù)線程參數(shù)啟動(dòng)掃描線程
func runScan(){
  t,ok := <- thread
  nowThread = t;
  if ok{
    for i := 0;i < nowThread;i++{
    go scan(strconv.Itoa(i))
    }
  }
  //等待線程終止
  for;<-thread == 0;{
    nowThread--
    if nowThread == 0{
      //全部線程已終止,關(guān)閉結(jié)果寫入,退出程序
      close(result)
      break
    }
  }
}
/**
  掃描線程
*/
func scan(threadId string){
  s,ok := <-ipAddrs
  for;ok;{
    fmt.Println("[thread-" + threadId + "] scan:" + s)
    _,err := net.Dial("tcp",s)
    if err == nil{
      //端口開放
      result <- s     
    }
    s,ok = <-ipAddrs
  }
  fmt.Println("[thread-" + threadId + "] end")
  thread <- 0;
}
//獲取下一個(gè)IP
func nextIp(ip string) string{
  ips := strings.Split(ip,".")
  var i int;
  for i = len(ips) - 1;i >= 0;i--{
    n,_ := strconv.Atoi(ips[i])
    if n >= 255{
      //進(jìn)位
      ips[i] = "1"  
    }else{
      //+1
      n++
      ips[i] = strconv.Itoa(n)
      break
    }
  }
  if i == -1{
    //全部IP段都進(jìn)行了進(jìn)位,說明此IP本身已超出范圍
    return "";
  }
  ip = ""
  leng := len(ips)
  for i := 0;i < leng;i++{
    if i == leng -1{
      ip += ips[i]
    }else{
      ip += ips[i] + "."
    }
  }
  return ip
}
//生成IP地址列表
func processIp(startIp,endIp string) []string{
  var ips = make([]string,0)
  for ;startIp != endIp;startIp = nextIp(startIp){
    if startIp != ""{
      ips = append(ips,startIp)
    }
  }
  ips = append(ips,startIp)
  return ips
}
//處理參數(shù)
func processFlag(arg []string){
  //開始IP,結(jié)束IP
  var startIp,endIp string
  //端口
  var ports []int = make([]int,0)
  index := 0
  startIp = arg[index]
  si := net.ParseIP(startIp)
  if si == nil{
    //開始IP不合法
    fmt.Println("'startIp' Setting error")
    return
  }
  index++
  endIp = arg[index]
  ei := net.ParseIP(endIp)
  if(ei == nil){
    //未指定結(jié)束IP,即只掃描一個(gè)IP
    endIp = startIp
  }else{
   index++
  }
  tmpPort := arg[index]
  if strings.Index(tmpPort,"-") != -1{
    //連續(xù)端口
    tmpPorts := strings.Split(tmpPort,"-")
    var startPort,endPort int
    var err error
    startPort,err = strconv.Atoi(tmpPorts[0])
    if err != nil || startPort < 1 || startPort > 65535{
      //開始端口不合法
      return
    }
    if len(tmpPorts) >= 2{
      //指定結(jié)束端口
      endPort,err = strconv.Atoi(tmpPorts[1])
      if err != nil || endPort < 1 || endPort > 65535 || endPort < startPort{
        //結(jié)束端口不合法
        fmt.Println("'endPort' Setting error")
        return
      }
    }else{
      //未指定結(jié)束端口
      endPort = 65535
    }
    for i := 0;startPort + i <= endPort;i++{
      ports = append(ports,startPort + i)
    }
  }else{
    //一個(gè)或多個(gè)端口
    ps := strings.Split(tmpPort,",")
    for i := 0;i < len(ps);i++{
      p,err := strconv.Atoi(ps[i])
      if err != nil{
        //端口不合法
        fmt.Println("'port' Setting error")
        return
      }
      ports = append(ports,p)
    }
  }
  index++
  t,err := strconv.Atoi(arg[index])
  if(err != nil){
    //線程不合法
    fmt.Println("'thread' Setting error")
    return
  }
  //最大線程2048
  if t < 1{
    t = 1;
  }else if t > 2048{
    t = 2048;
  }
  //傳送啟動(dòng)線程數(shù)
  thread <- t
  //生成掃描地址列表
  ips := processIp(startIp,endIp)
  il := len(ips)
  for i := 0; i < il;i++{
    pl := len(ports)
    for j := 0;j < pl;j++{
      ipAddrs <- ips[i] + ":" + strconv.Itoa(ports[j]) 
    }
  }
  close(ipAddrs)
}
func main(){
  flag.Parse()
  if flag.NArg() != 3 && flag.NArg() != 4{
    //參數(shù)不合法
    fmt.Println("Parameter error")
    return
  }
  //獲取參數(shù)
  args := make([]string,0,4)
  for i := 0;i < flag.NArg();i++{
    args = append(args,flag.Arg(i))
  }
  //啟動(dòng)掃描線程
  go runScan()
  //啟動(dòng)結(jié)果寫入線程
  go writeResult()
  //參數(shù)處理
  processFlag(args)
  //等待退出指令
  <- clo;
  fmt.Println("Exit")
}

以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。

相關(guān)文章

  • 詳解Go語言中的逃逸分析

    詳解Go語言中的逃逸分析

    逃逸分析是編譯器用于決定將變量分配到棧上還是堆上的一種行為,下面小編就來為大家詳細(xì)講講go語言中是如何進(jìn)行逃逸分析的,需要的小伙伴可以參考下
    2023-09-09
  • Go設(shè)計(jì)模式之代理模式圖文詳解

    Go設(shè)計(jì)模式之代理模式圖文詳解

    這篇文章將通過圖文講解給大家詳細(xì)的介紹一下Go代理模式,代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,代理控制著對(duì)于原對(duì)象的訪問, 并允許在將請(qǐng)求提交給對(duì)象前后進(jìn)行一些處理,感興趣的同學(xué)跟著小編一起來看看吧
    2023-07-07
  • Go語言中的速率限流策略全面詳解

    Go語言中的速率限流策略全面詳解

    這篇文章主要為大家介紹了Go語言中的速率限流策略全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Golang中多個(gè)if代碼優(yōu)化小技巧

    Golang中多個(gè)if代碼優(yōu)化小技巧

    這篇文章主要為大家詳細(xì)介紹了Golang中一些常用的if代碼優(yōu)化小技巧,w文中的示例代碼簡潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Go語言題解LeetCode599兩個(gè)列表的最小索引總和

    Go語言題解LeetCode599兩個(gè)列表的最小索引總和

    這篇文章主要為大家介紹了Go語言題解LeetCode599兩個(gè)列表的最小索引總和示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Golang?基礎(chǔ)面試題集錦

    Golang?基礎(chǔ)面試題集錦

    這篇文章主要為大家介紹了Golang?基礎(chǔ)面試題集錦,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Go 互斥鎖和讀寫互斥鎖的實(shí)現(xiàn)

    Go 互斥鎖和讀寫互斥鎖的實(shí)現(xiàn)

    本文主要介紹了Go 互斥鎖和讀寫互斥鎖的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 詳解golang函數(shù)多返回值錯(cuò)誤處理與error類型

    詳解golang函數(shù)多返回值錯(cuò)誤處理與error類型

    這篇文章主要為大家詳細(xì)介紹了golang中函數(shù)多返回值錯(cuò)誤處理與error類型的相關(guān)知識(shí),文中的示例代碼簡潔易懂,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)吧
    2023-10-10
  • Golang中可比較的數(shù)據(jù)類型詳解

    Golang中可比較的數(shù)據(jù)類型詳解

    在日常開發(fā)中,比較操作是最常用的基本操作之一,可以用來判斷變量之間是否相等或者對(duì)應(yīng)的大小關(guān)系,本文將深入解析 Golang 中可比較的數(shù)據(jù)類型,并結(jié)合代碼示例來說明如何在不同情況下進(jìn)行比較,需要的朋友可以參考下
    2024-01-01
  • Go語言append切片添加元素的實(shí)現(xiàn)

    Go語言append切片添加元素的實(shí)現(xiàn)

    本文主要介紹了Go語言append切片添加元素的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論

延津县| 高邮市| 威宁| 山东省| 尖扎县| 昂仁县| 海伦市| 达日县| 洛隆县| 乌拉特后旗| 顺昌县| 松潘县| 冷水江市| 乌鲁木齐市| 德阳市| 永和县| 黎川县| 浮山县| 广丰县| 太仆寺旗| 汕头市| 涿鹿县| 镇雄县| 阿拉尔市| 马山县| 雅江县| 平安县| 乌兰察布市| 平谷区| 定南县| 德钦县| 宕昌县| 平陆县| 周至县| 汉沽区| 博爱县| 西青区| 天全县| 崇明县| 德钦县| 沈丘县|