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缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
Go标准容器之Ring的使用说明
May 05 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
golang生成并解析JSON
Apr 14 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang bufio详细讲解
Apr 21 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
ubuntu10.04配置 nginx+php-fpm模式的详解
2013/06/03 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
2014/11/06 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
js的with语句使用方法
2007/09/21 Javascript
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
JS执行删除前的判断代码
2014/02/18 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
ReactJs设置css样式的方法
2017/06/08 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
js断点调试经验分享
2017/12/08 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
Python和php通信乱码问题解决方法
2014/04/15 Python
深入Python函数编程的一些特性
2015/04/13 Python
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
python生成随机密码或随机字符串的方法
2015/07/03 Python
Python 常用string函数详解
2016/05/30 Python
Python星号*与**用法分析
2018/02/02 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
谈谈python垃圾回收机制
2020/09/27 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
进程的查看和调度分别使用什么命令
2015/03/25 面试题
大学生毕业的自我鉴定
2013/11/13 职场文书
教师岗位职责
2013/11/17 职场文书
迟到检讨书900字
2014/01/14 职场文书
执法作风整顿剖析材料
2014/10/11 职场文书
投诉信回复范文
2015/07/03 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书