去语言编写的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(“退出”) }去语言制作端口扫描器