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 26 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
golang内置函数len的小技巧
Jul 25 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
Golang 对es的操作实例
Apr 20 Golang
深入理解 Golang 的字符串
May 04 Golang
基于Python实现西西成语接龙小助手
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
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
深入php之规范编程命名小结
2013/05/15 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
JS 控制CSS样式表
2009/08/20 Javascript
asm.js使用示例代码
2013/11/28 Javascript
一个js控制的导航菜单实例代码
2013/12/03 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
javascript适合移动端的日期时间拾取器
2015/11/10 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
PyCharm代码格式调整方法
2018/05/23 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
Python读取csv文件分隔符设置方法
2019/01/14 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
python使用Thread的setDaemon启动后台线程教程
2020/04/25 Python
python如何建立全零数组
2020/07/19 Python
数控加工专业毕业生自荐信
2013/09/27 职场文书
2014年测量员工作总结
2014/12/12 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书