golang实现TCP扫描器

非并发扫描100个TCP地址的实现
func main() {   start:=time.Now()   //扫描端口   for i := 21; i < 120; i++ {      address := fmt.Sprintf("20.194.168.28:%d", i)      //扫描端口      conn, err := net.Dial("tcp", address)      if err != nil {         fmt.Printf("%s关闭了\n", address)         continue      }      conn.Close()      fmt.Printf("%s打开了\n", address)   }   elapsed:=time.Since(start)/1e9   fmt.Printf("\n %dseconds\n",elapsed)}

如下图是扫描结果及所用时间,可以看到100个地址大概用了30几分钟,速度是非常的慢

golang实现TCP扫描器

并发扫描100个TCP地址(使用计数器来控制协程)

//并发操作
func main() {
    start := time.Now()
    //定义一个计数器
    var wg sync.WaitGroup
    //扫描端口
    for i := 21; i < 120; i++ {
        wg.Add(1)
        go func(j int) {
            defer wg.Done()
            address := fmt.Sprintf("20.194.168.28:%d", j)
            //扫描端口
            conn, err := net.Dial("tcp", address)
            if err != nil {
                fmt.Printf("%s关闭了\n", address)
                return
            }
            conn.Close()
            fmt.Printf("%s打开了\n", address)
        }(i)
    }
    wg.Wait()
    elapsed := time.Since(start) / 1e9
    fmt.Printf("/n/n %d seconds\n", elapsed)
}

如下图是扫描结果和运行时间,时间为21秒,大概是非并发扫描速度的100倍

golang实现TCP扫描器

Worker池扫描1024个TCP地址(使用channel控制协程)

创建Worker池

func Worker(ports chan int, results chan int) {   for p := range ports {      address := fmt.Sprintf("20.194.168.28:%d", p)      conn, err := net.Dial("tcp", address)      if err != nil {         results          continue      }      //关闭连接      conn.Close()      results    }}
func main() {
    start := time.Now()
    ports := make(chan int, 100)
    results := make(chan int)
    var openports []int
    var closeports []int

    for i := 0; i < cap(ports); i++ {
        go Worker(ports, results)
    }
    //保证先流出后流入
    go func() {
        for j := 1; j < 1024; j++ {
            ports  j
        }
    }()

    for i := 1; i < 1024; i++ {
        ports := results
        if ports != 0 {
            openports = append(openports, ports)
        } else {
            closeports = append(closeports, ports)
        }
    }
    //关闭channel通道
    close(ports)
    close(results)
    //对结果进行排序
    sort.Ints(openports)
    sort.Ints(closeports)
    for _, port := range openports {
        fmt.Printf("%d opened\n", port)
    }
    for _, port := range closeports {
        fmt.Printf("%d close\n", port)
    }
    elapsed := time.Since(start)
    fmt.Println("运行时间:", elapsed)
}

Original: https://www.cnblogs.com/hongyeci/p/13790345.html
Author: 红叶次
Title: golang实现TCP扫描器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609331/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 对象存储

    注意事项:如果文件类型是图片,则使用MultipartFile类的对象,如MultipartFile file(比较推荐) 适用于流式文件传输,在上传图片,音/视频,文档等,都可采…

    Java 2023年6月13日
    0114
  • 为什么一定要从DevOps走向BizDevOps?

    数字经济时代,数字化转型成为社会的普遍共识和行动。越来越多的业务运行在数字化基座之上, 软件系统正成为业务创新的价值核心和创新引擎。在这一趋势下,软件产业面临着许多新挑战和新机遇:…

    Java 2023年6月8日
    094
  • Linux(RedHat、Ubuntu)安装docker

    Linux(RedHat、Ubuntu)安装docker 前言 docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的…

    Java 2023年6月15日
    073
  • Spring基于注解+扫描管理bean

    @Component:将类标识为普通组件 @Controller:将类标识为控制层组件 @Service:将类标识为业务层组件 @Repository:将类标识为持久层组件(dao…

    Java 2023年6月16日
    0120
  • 三、DOS命令

    常用的DOS命令 #盘符切换 D: #查看当前目录下的所有文件 dir #切换目录 cd+空格+/d+空格+路径 #返回上一级 cd+空格+.. #清理屏幕 cls #退出终端 e…

    Java 2023年6月5日
    0119
  • springboot操作es

    转载:https://blog.csdn.net/qq_40018541/article/details/124839238?utm_medium=distribute.pc_re…

    Java 2023年5月30日
    093
  • springboot线程

    (1)确保只有一个线程调用这个方法并且确保只创建一个HotSpot VM实例。因为HotSpot VM创建的静态数据结构无法再次初始化,所以一旦初始化到达某个确定点后,进程空间里就…

    Java 2023年5月30日
    0102
  • 集合

    Collection(接口) 单列”集合” List(接口) (列表) 有序可重复 ArrayList 数组 LinkList 链表 Set (接口) 无序…

    Java 2023年6月8日
    091
  • WebSocket

    WebSocketConfig.java /** * WebSocket&#x914D;&#x7F6E;&#x7C7B; * @author admin *…

    Java 2023年6月9日
    0106
  • Mybatis 分批次新增插入数据

    public void insertSelective(List ssoNews) { //限制条数 int pointsD…

    Java 2023年6月13日
    098
  • 【Spring】 @ConditionalOnExpression 满足条件才初始化Bean 的奇技淫巧

    1.声明 某个Bean 仅在一定条件下 才初始化Bean,否则 就不初始化。 2.如上,如果在swappingA应用启动时,通过@Resource去获取线程池2,就会启动失败,找不…

    Java 2023年5月29日
    090
  • logrotate 切割Tomcat的catalina.out文件

    使用logrotate进行切割。 在/etc/logrotate.d下,新建tomcatrotate,编辑tomatrotate,写入如下内容: /usr/local/tomcat…

    Java 2023年6月15日
    095
  • CentOS7安装Git

    参考资料 下载地址 步骤 1.下载包 2.git-2.9.5.tar.gz 和 git-manpages-2.9.5.tar.gz上传服务器 3.解压并编译 参考资料 官网 Git…

    Java 2023年6月9日
    096
  • Spring实例化bean之后的处理, 关于BeanPostProcessor接口的使用

    业务需求:缓存页面,展示需要缓存的所有对象,每类对象在字典表中有编码对应,点击某个对象可以缓存某类对象,每类对象都有自己的缓存runner(弱弱的说一句,本人看到这里的第一反应就是…

    Java 2023年6月8日
    0100
  • synology drive client 连接失败

    添加路由映射,别管你的nas端口是多少,这玩意默认端口就是6690 Original: https://www.cnblogs.com/limumu/p/16385174.html…

    Java 2023年6月6日
    0116
  • Git rebase 合并多次提交

    在一般研发管理流程中,我们一般都是这么使用Git版本的: 0、先拿到一个需求(不细谈需求前面的采集、归纳整理、确认及评审等环节) 1、从主分支checkout一个新分支 2、在完成…

    Java 2023年6月6日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球