go 实现简易端口扫描的示例


Posted in Golang onMay 22, 2021

我在代码里定义了两个通道,分别用于生产端口和限制连接数,如果不限制连接数,容易被对方检测到或导致对方服务器不能正常运行。

// 生产端口
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 main

import (
  "fmt"
  "net"
  "sync"
  "time"
)


var wg sync.WaitGroup

func 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
请输入结束端口:> 8094
127.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 相关文章推荐
一文读懂go中semaphore(信号量)源码
Apr 03 Golang
Golang二维切片初始化的实现
Apr 08 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
go语言中fallthrough的用法说明
May 06 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Golang bufio详细讲解
Apr 21 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 Golang
go xorm框架的使用
May 22 #Golang
Golang实现AES对称加密的过程详解
May 20 #Golang
go语言基础 seek光标位置os包的使用
May 09 #Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 #Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 #Golang
GoLang中生成UUID唯一标识的实现
May 08 #Golang
聊聊golang中多个defer的执行顺序
May 08 #Golang
You might like
一个PHP+MSSQL分页的例子
2006/10/09 PHP
PHP调用Twitter的RSS的实现代码
2010/03/10 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
详解js中class的多种函数封装方法
2016/01/03 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
2016/07/01 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
javascript遍历json对象的key和任意js对象属性实例
2017/03/09 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
Python图像处理之识别图像中的文字(实例讲解)
2018/05/10 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
Python脚本如何在bilibili中查找弹幕发送者
2020/06/04 Python
浅谈Python 参数与变量
2020/06/20 Python
Python解析微信dat文件的方法
2020/11/30 Python
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
公积金转移接收函
2014/01/11 职场文书
爱国演讲稿500字
2014/05/04 职场文书
七夕活动策划方案
2014/08/16 职场文书
意外伤害赔偿协议书
2014/09/16 职场文书
政风行风评议工作总结
2014/10/21 职场文书
司法局2014法制宣传日活动总结
2014/11/01 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
新闻报道稿范文
2015/07/23 职场文书
微信小程序基础教程之echart的使用
2021/06/01 Javascript