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:垃圾回收GC触发条件详解
Apr 24 Golang
golang 比较浮点数的大小方式
May 02 Golang
golang日志包logger的用法详解
May 05 Golang
Go标准容器之Ring的使用说明
May 05 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
Golang中异常处理机制详解
Jun 08 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
Vue 3.0中jsx语法的使用
2020/11/13 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
让 python 命令行也可以自动补全
2014/11/30 Python
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
python学生信息管理系统(完整版)
2020/04/05 Python
python实现定时发送qq消息
2019/01/18 Python
Python猴子补丁知识点总结
2020/01/05 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
维德科技C#面试题笔试题
2015/12/09 面试题
护理学毕业生自荐信
2013/10/02 职场文书
大学新生军训个人的自我评价
2013/10/03 职场文书
工程测量与监理专业应届生求职信
2013/11/27 职场文书
授权委托书(完整版)
2014/09/10 职场文书
2014年法制宣传日活动方案
2014/11/02 职场文书
特岗教师个人总结
2015/02/10 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python