Golang 写一个端口扫描器

Golang 写一个端口扫描器,第1张

概述前话 最近痴迷于Golang这个新兴语言,因为它是强类型编译型语言,可以直接编译成三大平台的二进制执行文件,可以直接运行无需其他依赖环境。而且Golang独特的goroutine使得多线程任务执行如new一个对象般简单。 带着为学习理解Golang的好奇心情,我试着写了个端口扫描器。 github项目链接如下, 更多的实用工具我会慢慢添加。 https://github.com/pwcong/go 前话

最近痴迷于Golang这个新兴语言,因为它是强类型编译型语言,可以直接编译成三大平台的二进制执行文件,可以直接运行无需其他依赖环境。而且Golang独特的goroutine使得多线程任务执行如new一个对象般简单。

带着为学习理解Golang的好奇心情,我试着写了个端口扫描器。

github项目链接如下, 更多的实用工具我会慢慢添加。
https://github.com/pwcong/go-tools

源码 @H_404_14@package mainimport ( "flag" "fmt" "net" "os" "regexp" "strconv" "strings" "sync")var port intvar portRange stringvar parallelCounts intfunc init() { flag.Intvar(&port,"p", 80,"port") flag.StringVar(&portRange,"r","","range ports. format is <from>~<to>. eg. 100~200") flag.Intvar(&parallelCounts,"n", 1,"parallel counts") // 修改提示信息 flag.Usage = func() { fmt.Fprintf(os.Stderr,"\nUsage: %s [Options] <IP>\n\noptions:\n\n",os.Args[0]) flag.PrintDefaults() } flag.Parse()}func printopeningPort(port int) { fmt.Println("port " + strconv.Itoa(port) + " is opening")}func checkPort(ip net.IP,port int,wg *sync.WaitGroup,parallelChan *chan int) { defer wg.Done() tcpAddr := net.TCPAddr{ IP: ip,Port: port,} conn,err := net.DialTCP("tcp",nil,&tcpAddr) if err == nil { printopeningPort(port) conn.Close() } <-*parallelChan}func main() { args := flag.Args() if len(args) != 1 { flag.Usage() } else { ip := net.ParseIP(flag.Arg(0)) // 用于协程任务控制 wg := sync.WaitGroup{} if portRange != "" { matched,_ := regexp.Match(`^\d+~\d+$`,[]byte(portRange)) if !matched { flag.Usage() } else { portSecs := strings.Split(portRange,"~") startPort,err1 := strconv.Atoi(portSecs[0]) endPort,err2 := strconv.Atoi(portSecs[1]) if err1 != nil || err2 != nil || startPort < 1 || endPort < 2 || endPort <= startPort || parallelCounts < 1 { flag.Usage() } else { wg.Add(endPort - startPort + 1) // 用于控制协程数 parallelChan := make(chan int,parallelCounts) for i := startPort; i <= endPort; i++ { parallelChan <- 1 go checkPort(ip,i,&wg,&parallelChan) } wg.Wait() } } } else { wg.Add(1) parallelChan := make(chan int) go func() { parallelChan <- 1 }() go checkPort(ip,port,&parallelChan) wg.Wait() } }} 运行结果 执行 go build ./main.go, 生成二进制文件

运行二进制文件,结果如下:

@H_404_14@$ port-scanner.exeUsage: E:\Program files\GoPath\bin\port-scanner.exe [Options] <IP>Options: -n int parallel counts (default 1) -p int port (default 80) -r string range ports. format is <from>~<to>. eg. 100~200$ port-scanner.exe -p 80 127.0.0.1port 80 is opening$ port-scanner.exe -r 1~100 -n 50 127.0.0.1port 80 is opening 总结

以上是内存溢出为你收集整理的Golang 写一个端口扫描器全部内容,希望文章能够帮你解决Golang 写一个端口扫描器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1277057.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存