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 相关文章推荐
golang判断key是否在map中的代码
Apr 24 Golang
go原生库的中bytes.Buffer用法
Apr 25 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Golang中异常处理机制详解
Jun 08 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
golang语言指针操作
Apr 14 Golang
Golang 遍历二叉树
Apr 19 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 身份验证方面的函数
2009/10/11 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
页面按钮禁用与解除禁用的方法
2014/02/19 Javascript
javascript里绝对用的上的字符分割函数总结
2014/07/31 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
javascript 使用for循环时该注意的问题-附问题总结
2015/08/19 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
2018/04/05 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
python人人网登录应用实例
2014/09/26 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
python中threading开启关闭线程操作
2020/05/02 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
学习新党章思想汇报
2014/01/09 职场文书
司机工作自我鉴定
2014/09/19 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
七一建党节慰问信
2015/02/14 职场文书
自主招生自荐信格式
2015/03/04 职场文书
详解Vue的options
2021/05/15 Vue.js
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers
python区块链持久化和命令行接口实现简版
2022/05/25 Python