go怎么实现简易端口扫描
小编给大家分享一下go怎么实现简易端口扫描,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
我在代码里定义了两个通道,分别用于生产端口和限制连接数,如果不限制连接数,容易被对方检测到或导致对方服务器不能正常运行。
// 生产端口var port = make(chan int, 10)// 限制并发数var connect = make(chan string, 5)
可以使用net库的Dial函数做为socket客户端,需要注意的是要设置超时时间,因为若主机不存在,或目标端口是关闭的,往往需要花费数秒才返回错误,这样扫描大量端口时效率会极其低下。在go中可以使用net.Dialer结构体设置超时时间,然后在调用Dial方法:
d := net.Dialer{Timeout: time.Second}dial, err := d.Dial("tcp", target)
只要err不等于nil,表示目标端口是对外开放的。
完整代码如下:
package mainimport ( "fmt" "net" "sync" "time")var wg sync.WaitGroupfunc main() { var start, end int var address string fmt.Printf("请输入目标IP:> ") fmt.Scan(&address) fmt.Printf("请输入起始端口:> ") fmt.Scan(&start) fmt.Printf("请输入结束端口:> ") fmt.Scan(&end) wg.Add(end - start + 1) Run(address, start, end) wg.Wait() fmt.Println("执行完毕")}// 生产端口var port = make(chan int, 10)// 限制并发数var connect = make(chan string, 5)func Run(address string, start, end int) { go func() { for i := start; i <= end; i++ { port <- i } }() go func() { // 消费端口 for p := range port { // 往通道写入目标地址,超过限制并发数会阻塞 connect <- fmt.Sprintf("%s:%d", address, p) } }() go Connect()}func Connect() { // 并发请求 for target := range connect { // 设置超时时间 d := net.Dialer{Timeout: time.Second} dial, err := d.Dial("tcp", target) if err == nil { fmt.Printf("%s 连接成功\n", target) dial.Close() }else{ fmt.Printf("%s 连接失败\n", target) } wg.Done() }}
这里端口生产通道不是必须的,只是为了演示消费生产并发模型,当然这还是最简单的。
在Run函数里我没有关闭这两个通道,按官方的说法是gc会回收不使用的通道,如果要手动关闭,可以定义defer闭包进行close。
我本地运行结果如下:
请输入目标IP:> 127.0.0.1请输入起始端口:> 8080请输入结束端口:> 8094127.0.0.1:8080 连接成功127.0.0.1:8081 连接成功127.0.0.1:8082 连接成功127.0.0.1:8083 连接成功127.0.0.1:8084 连接成功127.0.0.1:8085 连接成功127.0.0.1:8086 连接成功127.0.0.1:8087 连接成功127.0.0.1:8088 连接成功127.0.0.1:8089 连接成功127.0.0.1:8090 连接成功127.0.0.1:8091 连接成功127.0.0.1:8092 连接成功127.0.0.1:8093 连接失败127.0.0.1:8094 连接失败执行完毕
这个版本比较简陋,TCP连接过程也可以简化,后续再写另外一篇文章。因为最近在学rust语言,语法内容比较多,所以后面暂时发布编程相关的文章,提升一下语法熟练度。
go适合做什么
go是golang的简称,而golang可以做服务器端开发,且golang很适合做日志处理、数据打包、虚拟机处理、数据库代理等工作。在网络编程方面,它还广泛应用于web应用、API应用等领域。
以上是“go怎么实现简易端口扫描”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341