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的channel交叉打印两个数组的操作
Apr 29 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
golang 比较浮点数的大小方式
May 02 Golang
goland 设置project gopath的操作
May 06 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang jwt身份认证
Apr 20 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
GoFrame框架数据校验之校验结果Error接口对象
Jun 21 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 批量更新网页内容实现代码
2010/01/05 PHP
XAMPP安装与使用方法详细解析
2013/11/27 PHP
php中的strpos使用示例
2014/02/27 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
使用vue根据状态添加列表数据和删除列表数据的实例
2018/09/29 Javascript
Vuex的初探与实战小结
2018/11/26 Javascript
react写一个select组件的实现代码
2019/04/03 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
Python下线程之间的共享和释放示例
2015/05/04 Python
初步讲解Python中的元组概念
2015/05/21 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
Python range与enumerate函数区别解析
2020/02/28 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
几个人围成一圈的问题
2013/09/26 面试题
造型师求职自荐信
2013/09/27 职场文书
人力资源管理专业学生自我评价
2013/11/20 职场文书
创业计划书中要认真思考的问题
2013/12/28 职场文书
国际会议邀请函范文
2014/01/16 职场文书
党支部公开承诺践诺书
2014/03/28 职场文书
卖房协议书
2014/04/11 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
建筑施工安全责任书
2014/07/24 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书