面向云技术架构 - 痴者工良

  • 首页
  • 工良写的电子书
    • kubernetes 教程
    • 从 C# 入门 Kafka
    • 多线程和异步
    • 动态编程-反射、特性、AOP
    • 表达式树
  • 本站文章导航
  • 隐私政策
愿有人陪你颠沛流离
遇到能让你付出的事物或者人,都是一种运气。
能遇到,就该珍惜。或许你们最终没能在一起,但你会切实地感受到力量。
正因为这样,那段相遇才变得有价值,才没有辜负这世间的每一段相遇。
  1. 首页
  2. 编程语言
  3. Golang
  4. 正文

Go 编写一个 TCP 简易扫描器

2021年11月17日 760点热度 0人点赞 0条评论
内容纲要

scanme.nmap.org 是要扫描的域名或 IP 地址。

package main

import (
    "fmt"
    "net"
    "sort"
)

func main() {
    ports := make(chan int, 100)
    results := make(chan int)
    var openports []int
    // 开启 100 个工作者线程
    for i := 0; i < cap(ports); i++ {
        go worker(ports, results)
    }
    // 向 chan 写入要扫描的端口
    go func() {
        for i := 1; i <= 1024; i++ {
            ports <- i
        }
    }()
    // 从通道中接收端口
    // 工作者线程无论执行成功与否,都必须向results 通道写入值,否则这里会阻塞
    for i := 1; i <= 1024; i++ {
        port := <-results
        if port != 0 {
            openports = append(openports, port)
        }
    }
    // 关闭所有通道
    close(ports)
    close(results)

    // 对放通的端口进行排序
    sort.Ints(openports)
    for _, port := range openports {
        fmt.Printf("%d open \n", port)
    }
}

// 工作者线程
func worker(ports, results chan int) {
    // 接收端口值,如果有则执行,没有则阻塞
    for p := range ports {
        // 扫描端口
        // 要求每次扫描,都要向 results 写入数据,失败则填写 0 ,成功则返回端口值;
        address := fmt.Sprintf("scanme.nmap.org:%d", p)
        conn, err := net.Dial("tcp", address)
        if err != nil {
            results <- 0
            return
        }
        _ = conn.Close()
        results <- p
    }
}
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: go tcp 扫描器 简易 编写
最后更新:2022年1月17日

痴者工良

高级程序员劝退师

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2022 whuanle.cn. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备18051778号

粤公网安备 44030902003257号