就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