博主头像
猫东东

好好生活,停止摸鱼

一个go写的端口检测的小工具

就2个文件,一个是ips.txt,每行一个ip:端口

IP列表文件:

127.0.0.1:8000
127.0.0.1:9000

检测文件:

package main

import (
    "bufio"
    "fmt"
    "net"
    "os"
    "strconv"
    "strings"
    "sync"
    "time"
)

func main() {
    // 读取ips.txt文件
    file, err := os.Open("ips.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // 创建一个等待组,用于等待所有goroutine完成
    var wg sync.WaitGroup

    // 使用bufio包的Scanner来逐行读取文件
    scanner := bufio.NewScanner(file)

    for scanner.Scan() {
        // 分割每行文本,获取IP和端口
        fields := strings.Split(scanner.Text(), ":")
        if len(fields) != 2 {
            fmt.Println("本行数据格不正确:", scanner.Text())
            continue
        }
        ip := fields[0]
        port := fields[1]

        // 验证端口是否为有效数字
        if _, err := strconv.Atoi(port); err != nil {
            fmt.Println("端口数据不正确:", port)
            continue
        }
        // 增加等待组的计数
        wg.Add(1)
        // 这里开始测试
        go func(ip, port string, wg *sync.WaitGroup) {
            defer wg.Done()
            // 使用net包的Dial函数尝试连接到指定的IP和端口
            conn, err := net.DialTimeout("tcp", ip+":"+port, 5*time.Second)
            if err != nil {
                // 如果连接失败,说明端口可能未开放
                fmt.Printf("IP: %s, 端口: %s 已关闭.\n", ip, port)
                return
            }
            defer conn.Close()
            // 如果连接成功,说明端口是开放的
            fmt.Printf("IP: %s, 端口: %s 是打开着的.\n", ip, port)

        }(ip, port, &wg)
    }
    wg.Wait()
}

食用方法:

go mod tidy
go run main.go
一个go写的端口检测的小工具
https://blog.del.pub/code/checkports.html
本文作者 猫东东
发布时间 2024-04-02
许可协议 CC BY-NC-SA 4.0
发表新评论