手写DNS服务器测速程序(工具分享)

手写DNS服务器测速程序(工具分享)

  • 目的
  • 特性
  • 下载地址
  • 使用方法
  • Golang代码

目的

为路由器设置dns时往往不知道如何设置dns为最佳,网上搜的脚本都不好用,于是手写了这个程序。

特性

  • 多DNS服务器并发测试
  • 每个DNS服务器测试多次测试取速度最快的结果
  • 支持默认DNS测试测试或者文件自定义DNS服务器测试
  • 结果按照DNS速度排序。

下载地址

Github下载

使用方法

>> race-dns-speed.exe 
Enter a domain: www.baidu.com
DNS resolution for www.baidu.com at 114.114.114.114 took 364.41 ms
DNS resolution for www.baidu.com at 208.67.220.220 took 395.63 ms
DNS resolution for www.baidu.com at 101.226.4.6 took 470.03 ms
DNS resolution for www.baidu.com at 223.6.6.6 took 470.03 ms
DNS resolution for www.baidu.com at 180.76.76.76 took 470.54 ms
DNS resolution for www.baidu.com at 119.29.29.29 took 473.33 ms
DNS resolution for www.baidu.com at 208.67.222.222 took 475.09 ms
DNS resolution for www.baidu.com at 223.5.5.5 took 477.62 ms
DNS resolution for www.baidu.com at 101.101.101.101 took 478.43 ms
DNS resolution for www.baidu.com at 8.8.8.8 took 480.65 ms
DNS resolution for www.baidu.com at 112.124.47.27 took 481.81 ms
DNS resolution for www.baidu.com at 114.215.126.16 took 487.02 ms
DNS resolution for www.baidu.com at 8.8.4.4 took 487.75 ms
DNS resolution for www.baidu.com at 123.125.81.6 took 490.54 ms
Enter a domain: www.sohu.com
DNS resolution for www.sohu.com at 223.6.6.6 took 362.69 ms
DNS resolution for www.sohu.com at 223.5.5.5 took 364.30 ms
DNS resolution for www.sohu.com at 8.8.4.4 took 367.48 ms
DNS resolution for www.sohu.com at 208.67.222.222 took 370.11 ms
DNS resolution for www.sohu.com at 208.67.220.220 took 370.11 ms
DNS resolution for www.sohu.com at 101.101.101.101 took 371.72 ms
DNS resolution for www.sohu.com at 119.29.29.29 took 372.36 ms
DNS resolution for www.sohu.com at 123.125.81.6 took 459.76 ms
DNS resolution for www.sohu.com at 114.215.126.16 took 461.91 ms
DNS resolution for www.sohu.com at 112.124.47.27 took 462.23 ms
DNS resolution for www.sohu.com at 101.226.4.6 took 462.46 ms
DNS resolution for www.sohu.com at 180.76.76.76 took 469.42 ms
DNS resolution for www.sohu.com at 114.114.114.114 took 469.48 ms
DNS resolution for www.sohu.com at 8.8.8.8 took 490.74 ms
Enter a domain: www.google.com 
DNS resolution for www.google.com at 223.6.6.6 took 0.50 ms
DNS resolution for www.google.com at 180.76.76.76 took 0.50 ms
DNS resolution for www.google.com at 101.226.4.6 took 0.50 ms
DNS resolution for www.google.com at 123.125.81.6 took 0.50 ms
...
...
...

Golang代码

package mainimport ("bufio""context""fmt""net""os""sort""time"
)var dnsServers = []string{"114.114.114.114","119.29.29.29","223.5.5.5","223.6.6.6","180.76.76.76","101.226.4.6","123.125.81.6","101.226.4.6","101.226.4.6","112.124.47.27","114.215.126.16","8.8.8.8","8.8.4.4","208.67.222.222","208.67.220.220","101.101.101.101",
}type DnsResult struct {Server stringTime   float64
}func resolve(domain string, dnsServer string, results chan<- DnsResult) {defer func() {if r := recover(); r != nil {fmt.Println("Recovered from panic in resolve:", r)}}()r := net.Resolver{PreferGo: true,Dial: func(ctx context.Context, network, address string) (net.Conn, error) {d := net.Dialer{Timeout: time.Millisecond * 5000,}return d.DialContext(ctx, network, dnsServer+":53")},}minTime := float64(1<<63 - 1) // max float64 valuefor i := 0; i < 10; i++ {start := time.Now()_, err := r.LookupHost(context.Background(), domain)elapsed := time.Since(start)if err != nil {fmt.Printf("DNS resolution for %s at %s failed: %v\n", domain, dnsServer, err)return} else {ms := elapsed.Seconds() * 1000if ms < minTime {minTime = ms}}}results <- DnsResult{Server: dnsServer, Time: minTime}
}func main() {if _, err := os.Stat("dns-servers.txt"); err == nil {file, err := os.Open("dns-servers.txt")if err != nil {fmt.Println("Error opening dns-servers.txt:", err)os.Exit(1)}defer file.Close()scanner := bufio.NewScanner(file)dnsServers = nilfor scanner.Scan() {dnsServers = append(dnsServers, scanner.Text())}if err := scanner.Err(); err != nil {fmt.Println("Error reading dns-servers.txt:", err)os.Exit(1)}}seen := make(map[string]bool)var uniqueDnsServers []stringfor _, server := range dnsServers {if !seen[server] {seen[server] = trueuniqueDnsServers = append(uniqueDnsServers, server)}}dnsServers = uniqueDnsServersfor {fmt.Print("Enter a domain: ")var domain stringfmt.Scanln(&domain)results := make(chan DnsResult, len(dnsServers))for _, dnsServer := range dnsServers {go resolve(domain, dnsServer, results)}var dnsResults []DnsResultfor range dnsServers {dnsResults = append(dnsResults, <-results)}close(results)sort.Slice(dnsResults, func(i, j int) bool {return dnsResults[i].Time < dnsResults[j].Time})for _, result := range dnsResults {fmt.Printf("DNS resolution for %s at %s took %.2f ms\n", domain, result.Server, result.Time)}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中的__dict__

类的__dict__返回的是&#xff1a;类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类的__dict__里的&#xff0c; 而实例化对象的&#xff1a;__dict__中存储了一些类中__init__的一些属性值。 import的py文件 __dict__返回的是&#xff1a;__init__的…

DARTS-: ROBUSTLY STEPPING OUT OF PERFORMANCE COLLAPSE WITHOUT INDICATORS

DARTS-&#xff1a;增加辅助跳跃连接&#xff0c;鲁棒走出搜索性能崩溃 论文链接&#xff1a;https://arxiv.org/abs/2009.01027 项目链接&#xff1a;GitHub - Meituan-AutoML/DARTS-: Code for “DARTS-: Robustly Stepping out of Performance Collapse Without Indicators…

数据平台“国产替代”掣肘在迁移?奇点云的工业制造实践解读

系列导读 如《“数据要素”三年行动计划&#xff08;2024—2026年&#xff09;》指出&#xff0c;工业制造是“数据要素”的关键领域之一。如何发挥海量数据资源、丰富应用场景等多重优势&#xff0c;以数据流引领技术流、资金流、人才流、物资流&#xff0c;对于制造企业而言是…

Qt5.14.2 全面解锁Qt5事件处理的精髓

上一篇博文中&#xff0c;我们从高空中俯瞰了Qt5事件编织的壮阔进程。无论是最普通的鼠标点击&#xff0c;还是最先进的多点触控手势&#xff0c;抑或是跨越线程的事件传递&#xff0c;Qt5都为开发者们提供了一整套完备的事件处理方案和强大工具链&#xff0c;只等着你来施展渔…

【面试题】ES文档写入和读取流程详解

前言&#xff1a;在回答这个问题之前我们先要搞清楚一个问题那就是什么是文档&#xff0c;避免不知所云&#xff01; 一、什么是文档&#xff1f; 在Elasticsearch中&#xff0c;文档&#xff08;Document&#xff09;是最基本的信息单元&#xff0c;用于表示和存储数据。文…

Android 系统应用 pk8签名文件转jks或keystore教程

一、介绍 签名文件对于我们在做应用开发中&#xff0c;经常遇到&#xff0c;且签名文件不仅仅是保护应用安全&#xff0c;还会涉及到应用与底层之间的数据共享和API文件等问题。 在Android中&#xff0c;签名文件同样也存在这个问题。但是android中又区分系统应用和普通应用。系…

C语言 青蛙跳台阶问题

目录 ​编辑 1.问题描述 2.问题分析 3.全部代码 4.结语 1.问题描述 一只青蛙可以一次跳一级台阶&#xff0c;也可以一次跳两级台阶&#xff0c;如果青蛙要跳上n级台阶有多少种跳法&#xff1f; 2.问题分析 当台阶只有一级时&#xff0c;只能跳一级&#xff0c;所以只有一…

用 C++ 编码架构图的最佳用例

统一建模语言&#xff08;UML&#xff09;&#xff0c;作为一种实际应用的语言标准&#xff0c;借助一系列架构图呈现建模软件系统。UML 的出现鼓励了自动化软件工具的开发&#xff0c;有助于自动代码生成。UML 图面向对象系统和软件工具&#xff0c;将静态结构和动态行为以可视…

注册、配置中心-微服务小白入门(2)

Nacos 已经下载安装并且使用了&#xff0c;那么看如何使用&#xff1a; Nacos 注册及配置&#xff0c;以下是一个服务启动后注册到nacos&#xff0c;同时&#xff0c;把该服务的相关配置&#xff0c;写到nacos之中 1、nacos设置 命名空间中&#xff0c;添加对应的服务命名空间…

Jenkins中支持maven构建遇到仓库报错问题

目的 Jenkins中支持maven构建(Jenkins使用docker安装&#xff09; 问题 1.构建一个maven项目 2.执行报错 /var/lib/jenkins/local_maven_repo/com/sx/root/1.0.4/root-1.0.4.pom.part.lock (No such file or directory) Failed to transfer Could not transfer artifact co…

【Flask】Flask项目部署上线

Flask 项目部署上线 1.Gunicorn Gunicorn 是一个纯 Python WSGI 服务器&#xff0c;配置简单&#xff0c;多工作者实现&#xff0c;方便 性能调优。 它倾向于与主机平台轻松集成。 它不支持 Windows &#xff08;但可以在 WSL 上运行&#xff09;。 它很容易安装&#xff0…

论文阅读之PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization(2024)

文章目录 论文地址主要内容主要贡献模型图技术细节实验结果 论文地址 PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization 主要内容 这篇文章的主要内容是介绍了一种名为PeriodicLoRA&#xff08;PLoRA&#xff09;的参数高效微调&#xff08;Parameter-…

TypeScript在学习(0)

1.什么是TypeScript? 答:TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集&#xff0c;而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。 个人浅见&#xff0c;我一直把ts简单理解成&#xff0c;其实就是javascript上多了…

SAP Fiori开发中的JavaScript基础知识3 - 类型转换,逻辑true和false

1 背景 在上一篇博客中&#xff0c;我我介绍了JavaScript最基本的语法&#xff0c;包括变量&#xff0c;操作符&#xff0c;值&#xff0c;类型的概念。在本篇博客中&#xff0c;我将介绍JavaScript中的类型转换逻辑&#xff0c;以及逻辑真假的概念。这些都属于JavaScript中最…

DY-36电压继电器 额定电压100V 整定范围40-160V 板前带座 JOSEF约瑟

系列型号&#xff1a; DY-32电压继电器&#xff1b; DY-36电压继电器&#xff1b; DY-33电压继电器&#xff1b; DY-37电压继电器&#xff1b; DY-34电压继电器&#xff1b; DY-38电压继电器&#xff1b; DY-31电压继电器&#xff1b; DY-35电压继电器&#xff1b; DY-32/60C电…

YOLO算法改进Backbone系列之:Conformer

CNN难以捕捉全局表征&#xff0c;这通常对高级计算机视觉任务至关重要。一个直观的解决方案是扩大感受野&#xff0c;但这可能需要更密集但具有破坏性的池化操作。由于自注意力机制和多层感知器&#xff08;MLP&#xff09;结构&#xff0c;transformer反映了复杂的空间变换和长…

Vue3 + vite + Ts 组件间通信

Vue3 vite Ts 组件间通信 1、props2、自定义事件3、mitt4、$attrs 1、props 概述&#xff1a;props 是使用频率最高的一种通信方式&#xff0c;常用与&#xff1a;父 和 子 互相传递 若 父传子 &#xff1a;属性值是非函数。若 子传父 &#xff1a;属性值是函数。 简单例子&…

【C++】this关键字和new关键字

一、this关键字 在 C 中&#xff0c; this 关键字是一个 指向调用对象的指针 。它在成员函数内部使用&#xff0c;用于引用调用该函数的对象。使用 this 可以明确指出成员函数正在操作的是哪个对象的数据成员。 示例&#xff1a; #include <iostream>using namespa…

网红电商主播培养体系招聘管理制度孵化方案

【干货资料持续更新&#xff0c;以防走丢】 网红电商主播培养体系招聘管理制度孵化方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 共120页可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 主播团队组建方案 让好主播主动留下 1. 好主播选拔标准…

【Flink】Flink 处理函数之基本处理函数(一)

1. 处理函数介绍 流处理API&#xff0c;无论是基本的转换、聚合、还是复杂的窗口操作&#xff0c;都是基于DataStream进行转换的&#xff0c;所以统称为DataStreamAPI&#xff0c;这是Flink编程的核心。 但其实Flink为了更强大的表现力和易用性&#xff0c;Flink本身提供了多…