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各时间字符串使用解析
Apr 02 Golang
Go语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
go语言-在mac下brew升级golang
Apr 25 Golang
Golang 正则匹配效率详解
Apr 25 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
Golang 遍历二叉树
Apr 19 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 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 中使用随机数的三个步骤
2006/10/09 PHP
php日历[测试通过]
2008/03/27 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
鼠标滚轮改变图片大小的示例代码
2013/11/20 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
2016/10/19 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
JavaScript, select标签元素左右移动功能实现
2020/05/14 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
Python用GET方法上传文件
2015/03/10 Python
详解Python之unittest单元测试代码
2018/01/24 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
基于Python实现粒子滤波效果
2020/12/01 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
岗位职责风险点
2014/03/12 职场文书
三八节主持词
2014/03/17 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android