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
解决golang结构体tag编译错误的问题
May 02 Golang
使用golang编写一个并发工作队列
May 08 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
Golang的继承模拟实例
Jun 30 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
Golang map映射的用法
Apr 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
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
2013/09/30 PHP
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
js变换显示图片的实例
2013/04/16 Javascript
子页向父页传值示例
2013/11/27 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
点击表单提交时出现jQuery没有权限的解决方法
2014/07/23 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
2015/09/15 Javascript
jQuery Validate表单验证深入学习
2015/12/18 Javascript
Validform+layer实现漂亮的表单验证特效
2016/01/17 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
2016/08/11 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
Python使用chardet判断字符编码
2015/05/09 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
python实现图片中文字分割效果
2019/07/22 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
CK美国官网:Calvin Klein
2016/08/26 全球购物
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
爱游人:Travelliker
2017/09/05 全球购物
新闻记者个人求职的自我评价
2013/11/28 职场文书
家长会主持词开场白
2014/03/18 职场文书
12岁生日演讲稿
2014/05/14 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js