一个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
Gemini评论Google AI Gemini Pro
正在加载gemini娘的评价
说说 归档 标签 朋友 关于
arrow_up
theme