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 21 Golang
golang日志包logger的用法详解
May 05 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Go Plugins插件的实现方式
Aug 07 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Golang gRPC HTTP协议转换示例
Jun 16 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
提问的智慧(2)
2006/10/09 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
JS支持带x身份证号码验证函数
2008/08/10 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
js中的json对象详细介绍
2014/10/29 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
基于vue的短信验证码倒计时demo
2017/09/13 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
vue ssr 指南详读
2018/06/29 Javascript
Python实现通讯录功能
2018/02/22 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
python用for循环求和的方法总结
2019/07/08 Python
Python必须了解的35个关键词
2020/07/16 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
2020/07/23 Python
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
饲料采购员岗位职责
2013/12/19 职场文书
关于学习的演讲稿
2014/05/10 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
公安机关党的群众路线教育实践活动剖析材料
2014/10/10 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
小学教师见习总结
2015/06/23 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
python绘图subplots函数使用模板的示例代码
2021/04/30 Python
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL