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 interface判断为空nil的实现代码
Apr 24 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Go语言grpc和protobuf
Apr 13 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
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
php 传值赋值与引用赋值的区别
2010/12/29 PHP
从手册去理解分析PHP session机制
2011/07/17 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
php post换行的方法
2020/02/03 PHP
Javascript中的数学函数
2007/04/04 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
javascript正则表达式中分组详解
2016/07/17 Javascript
预防网页挂马的方法总结
2016/11/03 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
Vue中fragment.js使用方法详解
2017/03/09 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
2017/07/17 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
python有证书的加密解密实现方法
2014/11/19 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
np.dot()函数的用法详解
2020/01/17 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
CSS3实现内凹圆角的实例代码
2017/05/04 HTML / CSS
HTML5 Canvas基本线条绘制的实例教程
2016/03/17 HTML / CSS
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
博士生导师推荐信
2014/07/08 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书