去语言制作端口扫描器

  

去语言编写的TCP端口扫描器,本人的第一个去程序。

  

Git@OSC: http://git.oschina.net/youshusoft/GoScanner

  

使用命令:

  

扫描仪startIp [endIp]端口线程

  

参数说明:

  

startIp 开始IP
  endIp 结束IP,可选,不输入表示只扫描startIp
  port 扫描端口,单个端口:3389;多个端口:1433年,3389;连续端口:135 - 3389
  thread 最大并发线程数,最高2048

  

扫描结果保存在同目录下的结果。txt中,每次启动都会清掉之前的内容。

  

例子一:
  扫描仪58.96.172.22 58.96.172.220 80 512
  扫描58.96.172.22到58.96.172.220中80的端口,最大并发线程512。

  

例子二:
  扫描仪58.96.172.22 58.96.172.220 21日5631 512
  扫描58.96.172.22到58.96.172.220中5631年的21日和端口,最大并发线程512。

  

例子三:
  扫描仪58.96.172.22 58.96.172.220 512 - 520
  扫描58.96.172.22到58.96.172.220中1到520的端口,最大并发线程512。

  

例子四:
  扫描仪58.96.172.22 512 - 520
  扫描58.96.172.22中1到520的端口,最大并发线程512。

        主要包   导入(   “fmt”   “strconv”   “国旗”   “弦”   “净”   “操作系统”   )/* *   扫描地址   */陈=让陈var ipaddr字符串(字符串)//扫描结果   陈=让陈var结果字符串(字符串)//线程数   var线程陈int=让陈(int)   var nowThread int;//关闭程序   var clo陈bool=使(陈bool)//保存结果   func writeResult () {   文件名:=" result.txt "   输出端,犯错:=os.Create(文件名)   如果犯错!=nil {//文件创建失败   fmt。Println(文件名+“创建错误”)   }   推迟fout.Close ()   年代,好:=& lt; -结果   {好吧,   输出信号。WriteString (s +“\ r \ n”)   年代,ok=& lt;——的结果   }//通知进程退出   clo & lt;——真正的;   }//根据线程参数启动扫描线程   func runScan () {   t,好:=& lt; -线程   nowThread=t;   如果好{   我:=0;我& lt;nowThread;我+ + {   扫描(strconv.Itoa(我))   }   }//等待线程终止   ;& lt;螺纹==0;{   nowThread——   如果nowThread==0 {//全部线程已终止,关闭结果写入、退出程序   关上(结果)   打破   }   }   }/* *   扫描线程   */func扫描(threadId字符串){   年代,ok:=& lt; -ipAddrs   {好吧,   fmt。Println(“[线程- " + threadId + "]扫描:”+ s)   _,犯错:=net.Dial (“tcp”,年代)   如果做错了==nil {//端口开放   结果& lt;   }   年代,ok=& lt; -ipAddrs   }   fmt。Println(“[线程- " + threadId + "]结束”)   线程& lt; - 0;   }//获取下一个IP   字符串函数nextIp (ip字符串){   “诱导多能性”:=strings.Split (ip,“。”)   var我int;   因为我=len (ips) - 1;我在=0;我——{   n, _:=strconv.Atoi (ips[我])   如果n祝辞=255 {//进位   ips[我]=" 1 "   其他}{//+ 1   n + +   ips[我]=strconv.Itoa (n)   打破   }   }   如果我==1 {//全部IP段都进行了进位,说明此IP本身已超出范围   返回";   }   ip=" "   愣:=len (ips)   我:=0;我& lt;愣,我+ + {   如果我==愣1 {   ip +=ips(我)   其他}{   ip +=ips[我]+“。”   }   }   返回的ip   }//生成IP地址列表   func processIp (startIp endIp字符串)[]字符串{   var ips=使([]字符串,0)   为,startIp !=endIp; startIp=nextIp (startIp) {   如果startIp !=" {   startIp ips=append (ips)   }   }   startIp ips=append (ips)   返回“诱导多能性”   }//处理参数   func processFlag (arg[]字符串){//开始IP,结束IP   var startIp, endIp字符串//端口   var港口int[]=使(int [], 0)   指数:=0   startIp=arg(指数)   如果:=net.ParseIP (startIp)   如果如果==nil {//开始IP不合法   fmt。Println (“startIp设置错误”)   返回   }   指数+ +   endIp=arg(指数)   ei:=net.ParseIP (endIp)   如果(ei==nil) {//未指定结束IP,即只扫描一个IP   endIp=startIp   其他}{   指数+ +   }   tmpPort:=arg(指数)   如果strings.Index (tmpPort,“-”) !=1 {//连续端口   tmpPorts:=strings.Split (tmpPort,“-”)   var startPort endPort int   var犯错的错误   startPort呃=strconv.Atoi (tmpPorts [0])   如果犯错!=nil | | startPort & lt;1 | | startPort祝辞65535年{//开始端口不合法   返回   }   如果len (tmpPorts)祝辞=2 {//指定结束端口   endPort呃=strconv.Atoi (tmpPorts [1])   如果犯错!=nil | | endPort & lt;1 | | endPort祝辞65535 | | endPort & lt;startPort {//结束端口不合法   fmt。Println (“endPort设置错误”)   返回   }   其他}{//未指定结束端口   endPort=65535   }   我:=0;startPort + i & lt;=endPort;我+ + {   港口=append(港口、startPort + i)   }   其他}{//一个或多个端口   ps:=strings.Split (tmpPort, ", ")   我:=0;我& lt;len (ps);我+ + {   p,犯错:=strconv.Atoi (ps[我])   如果犯错!=nil {//端口不合法   fmt。Println(“端口设置错误”)   返回   }   港口=append(港口、p)   }   }   指数+ +   t,犯错:=strconv.Atoi (arg(指数))   如果(呃!=nil) {//线程不合法   fmt。Println(“线程设置错误”)   返回   }//最大线程2048   如果t & lt;1){   t=1;   其他}如果t比;2048年{   t=2048;   }//传送启动线程数   线程& lt; - t//生成扫描地址列表   “诱导多能性”:=processIp (startIp endIp)   il:=len (ips)   我:=0;我& lt;伊尔,我+ + {   pl:=len(港口)   j:=0; j & lt;pl; j + + {   ipaddr & lt; - ips(我)+“:”+ strconv.Itoa(端口[j])   }   }   关上(ipaddr)   }   函数main () {   flag.Parse ()   如果flag.NArg () !=3,,flag.NArg () !=4 {//参数不合法   fmt。Println(“参数错误”)   返回   }//获取参数   参数:=([]字符串,0,4)   我:=0;我& lt;我+ + {flag.NArg ();   args=append (args, flag.Arg(我))   }//启动扫描线程   去runScan ()//启动结果写入线程   去writeResult ()//参数处理   processFlag (args)//等待退出指令   & lt; -克罗;   fmt.Println(“退出”)   }   

去语言制作端口扫描器